SwiftUI 屏幕安全区域

Joh*_*and 2 swiftui

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

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

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

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

Mof*_*waw 7

你试过这个吗?

在您EnvironmentObject的初始View.

这对我有用。

class GlobalModel: ObservableObject {
    
    //Safe Area size
    @Published var safeArea: (top: CGFloat, bottom: CGFloat)
    
    init() {
        self.safeArea = (0, 0)
    }
}
Run Code Online (Sandbox Code Playgroud)

在 SceneDelegate 内部。

let globalModel = GlobalModel()
let contentView = ContentView().environmentObject(globalModel)
Run Code Online (Sandbox Code Playgroud)

在您的初始视图中。

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

Run Code Online (Sandbox Code Playgroud)


710*_*511 7

更简单的解决方案:

UIApplication.shared.windows.first { $0.isKeyWindow }?.safeAreaInsets.bottom
Run Code Online (Sandbox Code Playgroud)

或更短:

UIApplication.shared.windows.first?.safeAreaInsets.top
Run Code Online (Sandbox Code Playgroud)