控制器在 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