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:防止 Image() 将视图矩形扩展到屏幕边界之外