59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
import SwiftUI
|
|
|
|
public extension View {
|
|
@ViewBuilder
|
|
func presentationDetentsIfAvailable() -> some View {
|
|
#if os(iOS) || os(tvOS)
|
|
if #available(iOS 16.0, tvOS 17.0, *) {
|
|
self.presentationDetents([.large])
|
|
.presentationDragIndicator(.visible)
|
|
} else {
|
|
self
|
|
}
|
|
#else
|
|
self
|
|
#endif
|
|
}
|
|
|
|
#if os(iOS) || os(tvOS)
|
|
@available(iOS 16.0, tvOS 17.0, *)
|
|
@ViewBuilder
|
|
func presentationDetentsIfAvailable(_ detents: PresentationDetent...) -> some View {
|
|
let detentSet: Set<PresentationDetent> = detents.isEmpty ? [.large] : Set(detents)
|
|
presentationDetents(detentSet)
|
|
.presentationDragIndicator(.visible)
|
|
}
|
|
#endif
|
|
|
|
@ViewBuilder
|
|
func actionButtonStyle() -> some View {
|
|
#if os(tvOS)
|
|
ActionButtonWrapper { self }
|
|
#else
|
|
if #available(iOS 26.0, macOS 26.0, *) {
|
|
self.frame(width: 36, height: 36)
|
|
.glassEffect(.regular.interactive(), in: .circle)
|
|
} else {
|
|
frame(width: 36, height: 36)
|
|
.background(Color.secondary.opacity(0.1))
|
|
.clipShape(Circle())
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#if os(tvOS)
|
|
private struct ActionButtonWrapper<Content: View>: View {
|
|
@Environment(\.isFocused) private var isFocused
|
|
let content: () -> Content
|
|
|
|
var body: some View {
|
|
content()
|
|
.frame(width: 36, height: 36)
|
|
.background(isFocused ? Color.secondary.opacity(0.3) : Color.secondary.opacity(0.1))
|
|
.clipShape(Circle())
|
|
.focusEffectDisabled()
|
|
}
|
|
}
|
|
#endif
|