导航栏的内容在iOS 13的模式中部分不可见

时间:2019-11-25 13:45:30

标签: swift modal-dialog storyboard uinavigationbar ios13

基于情节提要的应用程序在导航栏显示在模式屏幕中时(仅在物理设备上显示),呈现导航栏内容时出现问题。该代码在iOS 12和iOS 12和iOS 13.2.2的所有模拟器中均能正常运行。

comparative screenshot simulator vs physical device

屏幕截图的左侧是运行iOS 13.2.2的iPhone 11模拟器;右边是运行相同代码的iOS 13.2.2的iPhone X的Reflector投影。我们可以看到物理设备上的表视图和导航栏内容之间有一个空间,但是在模拟器上,表视图与导航栏齐平。

没有表格截面视图标题,表格视图边距设置为安全区域。其他人是否遇到过该问题,如果是,您如何解决?

这是从设备捕获的stackview的快照,在其中我们可以清楚地看到误渲染的区域恰好在UINavigationBar的边缘内: Xcode views stack capture

设置以下视图结构时,我还可以在一个全新项目中复制该问题:

Storyboard layout of view structures to replicate the issue

运行此演示项目的代码可在GitHub上找到:https://github.com/ekscrypto/stackoverflow-59033294

具有不同的行为: Demo of minimum reproducible build

我们可以看到物理设备在导航栏的内容和表格视图之间显示红色的栏;但是该红色条在模拟器中不可见。


edit:2019-11-25 16:45 EDT-根据下面的评论,我试图使用以下方法强制刷新布局:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 13.0, *) {
        DispatchQueue.main.async {
            self.navigationController?.navigationBar.setNeedsLayout()
            self.navigationController?.navigationBar.layoutIfNeeded()
        }
    }
}

有和没有调度异步,以及有和没有layoutIfNeeded;它没有为我解决这个特殊问题。

1 个答案:

答案 0 :(得分:0)

基于How to prevent gap between uinavigationbar and view in iOS 13?的答案(对我不起作用),我使用以下代码解决了我的问题:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 13.0, *) {
            self.navigationController?.setNavigationBarHidden(true, animated: false)
            self.navigationController?.setNavigationBarHidden(false, animated: false)
    }
}