其他SafeAreaInsets的奇怪行为

spl*_*ngi 5 uikit ios swift

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

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

发生的情况是,最初在人像中一切正常,然后旋转到风景后,一切也正常。但是,当从横向旋转到纵向时,将使用较大的横向值,并且由于值不正确,所有内容都会向右偏移。原因似乎是我只能增加额外的SafeAreaInsets变量值,而不能减少它?这是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
    }
}
Run Code Online (Sandbox Code Playgroud)

Dul*_*ule 2

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

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

至于为什么这个值是错误的,additionalSafeAreaInsets代表你希望视图减少多少安全区域,所以你可能想要这样:

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