首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取安全区域内嵌的顶部和底部高度

获取安全区域内嵌的顶部和底部高度
EN

Stack Overflow用户
提问于 2017-10-19 12:25:59
回答 23查看 258.6K关注 0票数 261

对于那些不安全的地区,什么是获得顶部和底部高度的最合适的方法?

EN

回答 23

Stack Overflow用户

回答已采纳

发布于 2017-10-19 13:49:44

试试这个:

中目标C

代码语言:javascript
运行
复制
if (@available(iOS 11.0, *)) {
    UIWindow *window = UIApplication.sharedApplication.windows.firstObject;
    CGFloat topPadding = window.safeAreaInsets.top;
    CGFloat bottomPadding = window.safeAreaInsets.bottom;
}

Swift

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
if #available(iOS 13.0, *) {
    let window = UIApplication.shared.windows.first
    let topPadding = window.safeAreaInsets.top
    let bottomPadding = window.safeAreaInsets.bottom
}
票数 532
EN

Stack Overflow用户

发布于 2017-10-19 13:45:47

要获得布局指南之间的高度,只需执行以下操作

代码语言:javascript
运行
复制
let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height

所以full frame height = 812.0safe area height = 734.0

下面是绿色视图具有guide.layoutFrame框架的示例

票数 124
EN

Stack Overflow用户

发布于 2018-04-06 01:23:52

Swift 4,5

使用约束将视图固定到安全区域锚点可以在视图控制器的生命周期中的任何位置执行,因为它们由API排队,并在视图加载到内存后处理。然而,获取安全区域值需要等待视图控制器生命周期的结束,比如viewDidLayoutSubviews()

此插件插入任何视图控制器:

代码语言:javascript
运行
复制
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就是这样设计的,更重要的是,在所有视图更改期间都会更新这些值,比如设备方向的更改。

但是,一些自定义呈现的视图控制器不能使用上述方法(我怀疑是因为它们处于瞬态容器视图中)。在这种情况下,您可以从根视图控制器中获取值,在当前视图控制器生命周期的任何地方都可以使用根视图控制器。

代码语言:javascript
运行
复制
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
}
票数 105
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46829840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档