主视图控制器根视图safeAreaInsets返回0的原因及状态栏、切换器高度获取
问题解答
为什么safeAreaInsets返回{0,0,0,0}?
苹果官方文档的描述是准确的,但你得到全0结果最常见的原因是调用时机过早——比如在viewDidLoad方法中执行这段代码。此时视图还未完成布局计算,系统尚未确定当前设备的安全区域Insets值,因此返回初始的{0,0,0,0}。
另外,如果你的应用设置了状态栏全局隐藏(UIStatusBarHidden设为YES),或者视图控制器的edgesForExtendedLayout属性配置导致视图完全延伸覆盖状态栏区域,也可能出现这种情况,但前者是最普遍的诱因。
如何获取状态栏高度?
iOS 13及以上版本
推荐通过当前窗口的安全区域Insets获取,需确保在视图布局完成后调用:
// 可在viewDidLayoutSubviews或viewDidAppear方法中执行 CGFloat statusBarHeight = self.view.window.safeAreaInsets.top;
也可通过UIStatusBarManager获取:
UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager; CGFloat statusBarHeight = statusBarManager.statusBarFrame.size.height;
iOS 12及以下版本
直接使用UIApplication的statusBarFrame属性:
CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
如何获取底部Home Indicator(上滑切换应用的线条)的高度?
这个元素官方称为Home Indicator,它的高度就是当前视图或窗口的safeAreaInsets.bottom值,同样需要在视图布局完成后调用:
// 可在viewDidLayoutSubviews或viewDidAppear方法中执行 CGFloat homeIndicatorHeight = self.view.safeAreaInsets.bottom;
注意:仅全面屏设备(如iPhone X及后续机型)会存在该元素,非全面屏设备的该值为0。
内容的提问来源于stack exchange,提问作者Vulkan
相关产品推荐
相关产品推荐

