如何在 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 提供建议:

添加 if #available 版本检查 添加@available 属性

如果您使用#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?

javascript windows.open打开fullscreen全屏

如何在 ios 版本 14.7.1 中获得相机权限?

iOS 14 的“声音识别”如何使用?