控制器在 iOS 13 中呈现模式时的 UINavigationBar 高度

Posted

技术标签:

【中文标题】控制器在 iOS 13 中呈现模式时的 UINavigationBar 高度【英文标题】:UINavigationBar height when controller presenting modal in iOS 13 【发布时间】:2019-09-25 21:54:58 【问题描述】:

控制器显示以下代码:

let vc = UIViewController()
vc.view.backgroundColor = Colors.green
let nvc = UINavigationController(rootViewController: vc)
self.present(nvc, animated: true, completion: nil)

显示

但导航栏高度很大。应该是这样的

如何像第二张图片那样做导航栏高度?

【问题讨论】:

【参考方案1】:

来自the discussion in apple developer forum,这似乎是 ios 13 中的一个错误。 他们提供的解决方法如下:

override func viewWillAppear(_ animated: Bool)   
    super.viewWillAppear(animated)  
    if #available(iOS 13.0, *)   
        navigationController?.navigationBar.setNeedsLayout()  
    

我已经在我的项目中对其进行了测试,它解决了这个问题。希望它也能解决你的问题。

【讨论】:

对我来说,我必须将这些代码放入 DispatchQueue.main.async 中才能使其工作。 对我不起作用。【参考方案2】:

当堆栈不是太深时,导航栏的大小实际上是正确的(至少对于 iOS 13 标准)。对于在索引 2(及更高版本?)处显示的视图,导航栏变得更小

要调整导航栏的大小,请执行以下两个步骤:

    获取默认高度约束(名称为"UI-View-Encapsulated-Layout-Height")。为此,请在导航栏的约束中进行搜索。我已经无耻地复制了下面的Isaih Turner's solution,这样更容易。

    extension UIView 
        /// Returns the first constraint with the given identifier, if available.
        ///
        /// - Parameter identifier: The constraint identifier.
        func constraintWithIdentifier(_ identifier: String) -> NSLayoutConstraint? 
            return self.constraints.first  $0.identifier == identifier 
        
    
    

    将常量设置为所需的值。

    let existingConstraint = self.navigationController?.navigationBar.constraintWithIdentifier("UIView-Encapsulated-Layout-Height")
    existingConstraint?.constant = 88.0
    self.navigationController?.navigationBar.setNeedsLayout()
    

你已经完成了。

【讨论】:

以上是关于控制器在 iOS 13 中呈现模式时的 UINavigationBar 高度的主要内容,如果未能解决你的问题,请参考以下文章

在 IOS 6 中使用情节提要以横向模式呈现 modalViewController

在 iOS 13 中呈现全屏模式时是不是可以使用滑动关闭?

从弹出窗口呈现视图

在 iOS 中导航期间更改 UITabBar

iOS 7 在 UINavigationController 中呈现模式视图?

iOS 13 UIActivityViewController 在图像保存后自动呈现以前的 VC