我正在尝试在SwiftUI应用启动时计算屏幕安全区域大小,因此我可以从不同屏幕大小的iOS设备的安全区域矩形中得出组件大小。
UIScreen.main.bounds-我可以一开始就使用它,但它可以显示整个屏幕,而不是安全区域
GeometryReader-使用它可以获取安全区域的CGSize,但我找不到在任何地方发送该值的方法-尝试使用同时引起错误的Notifications和简单函数
最后,我尝试在初始视图中使用.onPreferenceSet事件,然后在该闭包中在参考文件中设置CGSize变量,但是由于某种原因,这样做会使第一个视图初始化两次。有人知道在应用启动时获取边缘插图或安全区域大小的好方法吗?
答案 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