AdditionalSafeAreaInsets 的奇怪行为

Posted

技术标签:

【中文标题】AdditionalSafeAreaInsets 的奇怪行为【英文标题】:Strange behaviour of additionalSafeAreaInsets 【发布时间】:2018-12-09 13:23:39 【问题描述】:

我是 ios 开发的新手,在设置 AdditionalSafeAreaInsets 变量时,我在 UIViewController 中遇到了意想不到的奇怪行为。

我设置安全区域约束的原因是我使用这个library 在我的应用程序上实现侧边菜单。由于库通过使用 UIViewController 实现侧边菜单,即全屏的大小,使用屏幕宽度将其完全向左偏移,然后将偏移量减少预定义的值以显示菜单。在纵向模式下,我设置了一个较小的附加左侧安全区域值(例如 75,因为宽度更小),而在横向模式下,我必须使用更大的值来描述安全区域(例如 364)。

发生的情况是,最初在纵向时一切正常,然后在旋转到横向后,一切正常。但是当从横向旋转到纵向时,使用较大的横向值,并且由于值不正确,所有内容都向右偏移。原因似乎是我只能增加 AdditionalSafeAreaInsets 变量值,而不能减少它? 这是 UIKit 的预期行为吗?如何避免或重置额外的SafeAreaInsets?

下面是我的 UIViewController 中的一些相关代码

@available(iOS 11.0, *)
func updateLeftInset(size: CGSize) 

    let leftInset = size.width - SideMenuController.preferences.basic.menuWidth

    self.additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: 0)



override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
    print("viewWillTransition")

    if #available(iOS 11.0, *) 
        updateLeftInset(size: size)
     else 
        // Fallback on earlier versions
    


override func viewDidLoad() 
    if #available(iOS 11.0, *) 
        updateLeftInset(size: view.bounds.size)
     else 
        // Fallback on earlier versions
    

【问题讨论】:

对我来说,解决这个问题的方法是使用普通的旧布局边距插图而不是 safeAreaInsets。这实际上对我来说效果更好,因为它向后兼容旧的 iOS 版本。也许这条评论可以让那些在这个问题上苦苦挣扎的人有所了解。虽然,这并没有回答关于附加安全区域插入的原始问题,所以我暂时保留这个问题。 【参考方案1】:

问题是在viewDidLoad() 中获取视图的边界是错误的。

您应该在viewWillAppear 中执行此操作,您将在那里获得正确的值。

至于为什么值不对,additionalSafeAreaInsets表示你希望view减少多少安全区域,所以你大概想要这个:

self.additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: SideMenuController.preferences.basic.menuWidth, bottom: 0, right: 0)

【讨论】:

很遗憾,这不是一个正确的答案。如果您更仔细地阅读了我的问题,那么您会注意到初始加载后一切正常。当我从水平旋转到纵向以及尝试编辑附加安全区域插入以获取更小的值时,出现了问题。至于这个说法“至于为什么值是错误的,additionalSafeAreaInsets 代表你希望视图减少多少安全区域......”。变量名本身就表明该变量增加了安全区域插入。 @splangi 初始加载后一切正常纯属巧合,viewDidLoad 中未定义 view.bounds.size。变量增加安全区域insets,从而减小安全区域大小see here。

以上是关于AdditionalSafeAreaInsets 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

UIKit: Apps for Every Size and Shape

iOS11中如何设置导航栏与ViewController内容重叠

扩展iOS 11安全区域以包括键盘