SwiftUI屏幕安全区域

时间:2020-06-24 15:13:53

标签: swiftui

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

UIScreen.main.bounds-我可以一开始就使用它,但它可以显示整个屏幕,而不是安全区域

GeometryReader-使用它可以获取安全区域的CGSize,但我找不到在任何地方发送该值的方法-尝试使用同时引起错误的Notifications和简单函数

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

2 个答案:

答案 0 :(得分:2)

您尝试过吗?

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

这对我有用。

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()
       }
    }
}

答案 1 :(得分:0)

更简单的解决方案:

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

或更短:

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