如何在 iOS 14 中使用 fullScreenCover,但在 13 中使用工作表
Posted
技术标签:
【中文标题】如何在 iOS 14 中使用 fullScreenCover,但在 13 中使用工作表【英文标题】:How to use fullScreenCover with iOS 14 but sheet for 13 【发布时间】:2020-07-23 14:06:43 【问题描述】:想象一下,您已经构建了一个使用 sheet
API 来呈现模态表的屏幕,现在使用 SwiftUI 2.0 在 ios 14 上运行时您想使用 fullScreenCover
代替。您是如何做到的? Xcode 提供建议:
如果您使用#available 版本检查,它会使用#available 包装所有范围内的代码,因此您必须复制所有这些代码才能更改那一行代码。如果你使用@available,你必须复制整个结构。
有没有办法让“内联”逻辑表明 iOS 14 是否添加了这个修饰符,否则回退到这个修饰符,而不必复制所有其余的视图代码?
一个例子:
VStack
//a lot of other views here
.sheet(isPresented: self.$showingSomeView) //TODO: Replace sheet with fullScreenCover for iOS 14+
SomeView()
【问题讨论】:
【参考方案1】:这是可能的方法
struct DemoCompatibleFullScreen: View
@State private var activateFullScreen = false
var body: some View
Button("Toggle") self.activateFullScreen.toggle()
.compatibleFullScreen(isPresented: $activateFullScreen)
Text("I'm in Full Screen!")
extension View
func compatibleFullScreen<Content: View>(isPresented: Binding<Bool>, @ViewBuilder content: @escaping () -> Content) -> some View
self.modifier(FullScreenModifier(isPresented: isPresented, builder: content))
struct FullScreenModifier<V: View>: ViewModifier
let isPresented: Binding<Bool>
let builder: () -> V
@ViewBuilder
func body(content: Content) -> some View
if #available(iOS 14.0, *)
content.fullScreenCover(isPresented: isPresented, content: builder)
else
content.sheet(isPresented: isPresented, content: builder)
【讨论】:
以上是关于如何在 iOS 14 中使用 fullScreenCover,但在 13 中使用工作表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WTL 应用程序中设置 CWindowImpl FullScreen?
如何在 iOS 14 中使用 fullScreenCover,但在 13 中使用工作表
如何在 8 秒内完成 Ads_Fullscreen Activity 并在病房后午餐 MainActivity?