我们有两个UIViewController
UINavigationController
。
在viewWillAppear(_ animated: Bool)
内部的第一个VC中,我们做了:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationItem.largeTitleDisplayMode = .always
}
....
在第二个VC的内部,我们在viewWillAppear(_ animated: Bool)
:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = false
}
...
第二个VC的过渡动画是平滑的,而点击自动生成的后退按钮会导致导航控制器标题创建一个奇怪的jump to large title
而不是正常的grow to large title
动画,就像在消息中一样应用
如果我点击标签栏图标为"返回"操作,它做正确的过渡动画。
知道什么可能导致该问题或我如何解决它?
答案 0 :(得分:7)
将largeTitleDisplayMode
设置为.never
您无需将prefersLargeTitles
设置为false
。
为了澄清这里的内容,您需要直接为视图控制器的largeTitleDisplayMode
设置navigationItem
,而不是导航控制器!
self.navigationItem.largeTitleDisplayMode = .never // This fixes the issue
self.navigationController?.navigationItem.largeTitleDisplayMode = .never // This doesn't work / Title will stay large
答案 1 :(得分:0)
@dave的答案对我有用!谢谢!这是我全部使用的代码:
FirstViewController:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.largeTitleDisplayMode = .always
navigationController?.navigationBar.prefersLargeTitles = true
}
}
}
SecondViewController:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 11.0, *) {
navigationItem.largeTitleDisplayMode = .never
}
}
}
答案 2 :(得分:0)
我有一个相同的过渡错误:从大标题到小标题或向后。它并没有从一种状态增加/减少到另一种状态,但是在屏幕上停留了丑陋的状态1秒钟,然后从大状态跳到小状态,反之亦然。
简单的解决方案:
确保每个视图控制器在情节提要中都有一个NavigationItem。
然后为每个navigationItem设置相应的
Large Title
值:
此外,您无需在viewDidLoad
,viewWillAppear
等中设置与largeTitle相关的任何内容。就是我上面显示的内容。
答案 3 :(得分:0)
应该在关闭大标题后立即强制布局导航栏
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
navigationController?.navigationBar.layoutIfNeeded()
}
这会立即取消大导航标题。