不确定这是否是同样的问题,但我们在升级到 iOS 11 时也遇到了这个问题。
我们手动将导航栏高度设置为 64 并固定到超级视图边缘。遵守 UINavigationBarDelegate 协议并实现 UIBarPositioningDelegate 委托方法为我们解决了这个问题。
我们更换了
navigationBar.autoPinEdgesToSuperviewEdgesExcludingEdge(.bottom)
navigationBar.autoSetDimension(.height, toSize: 64)
与
...
if #available(iOS 11.0, *) {
navigationBar.topAnchor.constraint(
equalTo: self.view.safeAreaLayoutGuide.topAnchor
).isActive = true
} else {
navigationBar.topAnchor.constraint(
equalTo: topLayoutGuide.bottomAnchor
).isActive = true
}
navigationBar.autoPinEdge(toSuperviewEdge: .left)
navigationBar.autoPinEdge(toSuperviewEdge: .right)
navigationBar.delegate = self
...
public func position(for bar: UIBarPositioning) -> UIBarPosition
return .topAttached
}
这是使用 purelayout DSL 进行一些自动布局调用 (https://github.com/PureLayout/PureLayout)
有类似的问题。就我而言,事实证明,以前的视图控制器具有自定义导航栏,因此它隐藏了导航栏和状态栏。有
UIApplication.shared.setStatusBarHidden(true, with: UIStatusBarAnimation.none)
UIApplication.shared.setStatusBarStyle(.default, animated: false)
在有问题的视图控制器中我有这个:
UIApplication.shared.setStatusBarStyle(.default, animated: false)
UIApplication.shared.setStatusBarHidden(false, with: UIStatusBarAnimation.none)
只需将两行按正确的顺序放置即可解决问题:
UIApplication.shared.setStatusBarHidden(false, with: UIStatusBarAnimation.none)
UIApplication.shared.setStatusBarStyle(.default, animated: false)
以上所有内容均已弃用,因此另一个可能的解决方案可能是将其更改为隐藏状态栏的推荐方式(如此处所述,这还不理想:setStatusBarHidden 已弃用,但唯一有效的方法)。
将子视图设置为超级视图的顶部约束...单击编辑约束如果您看到“将顶部对齐到:安全区域”,请将其更改为超级视图,以便它重叠