SwiftUI 屏幕安全区

Posted

技术标签:

【中文标题】SwiftUI 屏幕安全区【英文标题】:SwiftUI Screen safe area 【发布时间】:2020-06-24 15:13:53 【问题描述】:

我试图在 SwiftUI 应用启动时计算屏幕安全区域大小,以便我可以从不同屏幕大小的 ios 设备的安全区域矩形中得出组件大小。

UIScreen.main.bounds - 我可以在开始时使用它,但它给了我整个屏幕而不是安全区域

GeometryReader - 使用它我可以获得安全区域的 CGSize,但我找不到将它发送到任何地方的方法 - 尝试使用通知和简单的函数,这两者都会导致错误

最后,我尝试在初始视图中使用 .onPreferenceSet 事件,然后在该闭包中在参考文件中设置一个 CGSize 变量,但由于某种原因,这样做会使第一个视图初始化两次。有谁知道在应用启动时获得边缘插图或安全区域大小的好方法?

【问题讨论】:

为什么要在任何地方发送安全区的大小? 你会在代码中显示你想要做什么但它不起作用吗? @pawello2222 - 我想在启动时创建一个文件,其中包含其他视图可以参考的测量值列表 @JohnOfIreland 在 SwiftUI 中通常不需要它。请分享您的代码,以便我们为您提供帮助。 有效,但会触发 ContentView() 的其余部分两次 【参考方案1】:

更简单的解决方案:

UIApplication.shared.windows.first  $0.isKeyWindow ?.safeAreaInsets.bottom

或更短:

UIApplication.shared.windows.first?.safeAreaInsets.top

【讨论】:

您能否在回答中提供一些代码格式化程序和解释? 感谢您回答 Leonard,但我之前已经接受了回答【参考方案2】:

你试过了吗?

在您的初始View 中初始化代码后,您可以使用EnvironmentObject 将安全区域插入发送到代码中的任何位置。

这对我有用。

class GlobalModel: ObservableObject 
    
    //Safe Area size
    @Published var safeArea: (top: CGFloat, bottom: CGFloat)
    
    init() 
        self.safeArea = (0, 0)
    

在 SceneDelegate 中。

let globalModel = GlobalModel()
let contentView = ContentView().environmentObject(globalModel)

在您的初始视图中。

struct ContentView: View 
    @EnvironmentObject var globalModel: GlobalModel

    var body: some View 
       ZStack 
          GeometryReader  geo in
             Color.clear
                .edgesIgnoringSafeArea(.all)
                .onAppear 
                   self.globalModel.safeArea = (geo.safeAreaInsets.top, geo.safeAreaInsets.bottom)
                
          
        
          SomeView()
       
    


【讨论】:

以上是关于SwiftUI 屏幕安全区的主要内容,如果未能解决你的问题,请参考以下文章

如何在swiftUI中删除顶部安全区域

SwiftUI 视图在安全区域附近自行调整

SwiftUI:防止 Image() 将视图矩形扩展到屏幕边界之外

iOS SwiftUI:ScrollView 忽略顶部安全区域

如何在swiftUI中忽略具有线性渐变的背景的安全区域?

在 SwiftUI 中,为啥 Spacer 会将文本推送到 TextEditor 框架之外?