我有一个UINavigationController
,默认值为navigationBar.prefersLargeTitles = true
。
当我将false
切换到新场景时,我将其切换为push
,方法是将其更改为DetailsViewController
来调用它。
viewWillDisappear
现在在override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}
中,我正在使用DetailsViewController
。
willMove(to parent:)
要过渡回大标题。
考虑 iOS 12 是正确的行为,请观察所附的快照,了解 iOS 13 的运行方式和 iOS 12 的运行方式。
iOS 13 :
iOS 12 :
答案 0 :(得分:11)
您所做的总是错误的。您应该将导航栏的prefersLargeTitles
设置为true
一次,再也不要触摸它。
更改每个视图控制器对大标题所做的工作的方式是,该视图控制器将自己的navigationItem
(在其viewDidLoad
中)设置为具有所需的largeTitleDisplayMode
。所以如果第一个v.c.拥有.always
,第二拥有.never
,一切都会变得顺畅。
答案 1 :(得分:0)
我遇到了同样的问题,不得不在第二个ViewController的故事板上放置NavigationItem。 segue自动创建了我的NavigationItem,并且prefersLargeTitle
中的viewDidLoad()
在视图出现之前尚未完成创建。在情节提要中添加NavigationItem可以解决此问题,并允许我在情节提要的属性菜单中设置prefersLargeTitle
。
答案 2 :(得分:0)
在我的情况下,此问题是在对UITabBarController
的子级的视图控制器进行搜索时发生的。在子视图控制器上设置largeTitleDisplayMode
不足以解决此错误。
我通过将导航项添加到UITabBarController场景并将largeTitleDisplayMode
设置为.never
来解决了这个问题。
答案 3 :(得分:-1)
确保我们只是在 viewDidLoad 中设置大标题属性。并且不需要设置 navigationController?.navigationBar.prefersLargeTitles = false 来制作小导航标题。
这是一个非常好的解决方案!
创建了 BaseViewController,它具有在视图控制器中启用或禁用大标题的扩展。默认情况下,在父视图控制器中禁用大标题:
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
disableLargeTitle()
}
}
extension BaseViewController {
public func enableLargeTitle() {
navigationItem.largeTitleDisplayMode = .always
}
public func disableLargeTitle() {
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .never
}
}
如果你想在任何视图控制器中启用大标题,只需在 viewDidLoad 方法中调用 enableLargeTitle 即可。
class AnyViewController: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
enableLargeTitle()
}
}