Swiftui 快捷屏幕安全区

Swiftui 快捷屏幕安全区,swiftui,Swiftui,我正在尝试在SwiftUI应用程序发布中计算屏幕安全区域大小,这样我就可以从不同屏幕大小的iOS设备的安全区域矩形中导出组件大小 UIScreen.main.bounds-我可以在开始时使用它,但它提供了整个屏幕,而不是安全区域 GeometryReader-使用它我可以获得安全区域的CGSize,但我找不到将其发送到任何地方的方法-尝试使用通知和简单函数,这两种方法都会导致错误 最后,我尝试在初始视图中使用.onPreferenceSet事件,然后在该闭包集中使用引用文件中的CGSize变量,

我正在尝试在SwiftUI应用程序发布中计算屏幕安全区域大小,这样我就可以从不同屏幕大小的iOS设备的安全区域矩形中导出组件大小

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

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

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

你试过吗

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

这对我有用

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

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


更简单的解决方案:

UIApplication.shared.windows.first{$0.isKeyWindow}?.safeAreaInsets.bottom
或更短:

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

为什么您需要将安全区域的大小发送到任何地方?您是否可以在代码中显示您试图执行的操作,但它不起作用?@pawello2222-我想在启动时创建一个文件,其中包含其他视图可以查看的测量列表reference@JohnOfIreland在SwiftUI中通常不需要它。请分享您的代码,以便我们可以帮助您。必须将它们放在两个单独的注释中。请在您的答案中提供一些代码格式设置程序和解释?谢谢您的回答Leonard,但我刚才已经接受了答案