【问题标题】:Why is additionalSafeAreaInsets propagated to child VCs?为什么 AdditionalSafeAreaInsets 会传播到子 VC?
【发布时间】:2018-09-24 15:22:54
【问题描述】:

根据 Apple 的文档没有证据表明这一点,但我发现 additionalSafeAreaInsets 被传播到 childVCs,但显然是这样。

在 iPhone 7 模拟器上运行 this gist 将输出容器 VC 和子 VC 的底部安全区域插入为 88,而我希望只有容器 VC 有,而 ChildVC 会有 0(在 iPhone X 和更新版本上,只是 Home Indicator 所需的数量)。

有没有办法得到这种行为?

谢谢!

【问题讨论】:

    标签: ios uikit safearealayoutguide


    【解决方案1】:

    这不是来自Apple Documentation的证据吗?

    UIKit 容器视图控制器已经调整了它们的子视图控制器的安全区域来考虑内容视图。例如,导航控制器扩展了其子视图控制器的安全区域,以适应导航栏。

    顺便说一句,这不是传播。这是一件更聪明的事情,很有意义。如果您将ContainerViewController 的安全区域从底部设置为80 points,并且您的ChildViewController 与该区域的X 点重叠,UIKit 将自动将此子视图控制器的安全区域设置为X点,因此没有子视图可以超出您的安全区域。

    例如,如果您设置 childVC 这样的约束

    NSLayoutConstraint.activate([
        childVC.view.heightAnchor.constraint(equalToConstant: childVCHeight),
        childVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        childVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        // move childVC 30 points to the top
        childVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -30)
    ])
    

    在日志中您会看到,ChildViewController 安全区域高度为 50。这正是重叠的高度。

    【讨论】:

    • 非常感谢 Yury 的回答。再次阅读文档,您似乎只应该为您的子 VC 设置 additionalSafeAreaInsets 而不是将您的 additionalSafeAreaInsets 设置为布局代码的一部分。甚至示例代码也是针对 childVC 的。
    • @PierluigiCifani 是的,UIKit 会将 Insets 添加到现有重叠中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多