对于那些不安全的地区,什么是获得顶部和底部高度的最合适的方法?
发布于 2017-10-19 13:49:44
试试这个:
在中目标C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.windows.firstObject;
CGFloat topPadding = window.safeAreaInsets.top;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
在Swift中
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
let topPadding = window?.safeAreaInsets.top
let bottomPadding = window?.safeAreaInsets.bottom
}
在Swift - iOS 13.0及以上
//将windows数组中的第一个元素用作KeyWindow
if #available(iOS 13.0, *) {
let window = UIApplication.shared.windows.first
let topPadding = window.safeAreaInsets.top
let bottomPadding = window.safeAreaInsets.bottom
}
发布于 2017-10-19 13:45:47
要获得布局指南之间的高度,只需执行以下操作
let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height
所以full frame height = 812.0
,safe area height = 734.0
下面是绿色视图具有guide.layoutFrame
框架的示例
发布于 2018-04-06 01:23:52
Swift 4,5
使用约束将视图固定到安全区域锚点可以在视图控制器的生命周期中的任何位置执行,因为它们由API排队,并在视图加载到内存后处理。然而,获取安全区域值需要等待视图控制器生命周期的结束,比如viewDidLayoutSubviews()
。
此插件插入任何视图控制器:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let topSafeArea: CGFloat
let bottomSafeArea: CGFloat
if #available(iOS 11.0, *) {
topSafeArea = view.safeAreaInsets.top
bottomSafeArea = view.safeAreaInsets.bottom
} else {
topSafeArea = topLayoutGuide.length
bottomSafeArea = bottomLayoutGuide.length
}
// safe area values are now available to use
}
我更喜欢这种方法,而不是将其从窗口中删除(如果可能的话),因为API就是这样设计的,更重要的是,在所有视图更改期间都会更新这些值,比如设备方向的更改。
但是,一些自定义呈现的视图控制器不能使用上述方法(我怀疑是因为它们处于瞬态容器视图中)。在这种情况下,您可以从根视图控制器中获取值,在当前视图控制器生命周期的任何地方都可以使用根视图控制器。
anyLifecycleMethod()
guard let root = UIApplication.shared.keyWindow?.rootViewController else {
return
}
let topSafeArea: CGFloat
let bottomSafeArea: CGFloat
if #available(iOS 11.0, *) {
topSafeArea = root.view.safeAreaInsets.top
bottomSafeArea = root.view.safeAreaInsets.bottom
} else {
topSafeArea = root.topLayoutGuide.length
bottomSafeArea = root.bottomLayoutGuide.length
}
// safe area values are now available to use
}
https://stackoverflow.com/questions/46829840
复制相似问题