我想要一个带有大标题的视图,然后推另一个带有常规标题的视图,然后再回到带有大标题的视图。
我尝试在prefersLargeTitles = true
的第一个视图中设置viewWillAppear
,并在prefersLargeTitles = false
的第二个视图中设置viewWillAppear
。可以,但是标题没有从第二个视图到第一个视图时通常的平滑过渡。
class FirstViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.prefersLargeTitles = true
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let secondViewController = secondViewController.storyboardInstance() {
self.navigationController?.pushViewController(secondViewController, animated: true)
}
}
}
class SecondViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}
}
答案 0 :(得分:0)
您可以在prefersLargeTitles
的{{1}}方法中将false
属性设置为viewWillDisappear
。这样的事情应该起作用:
FirstViewController
答案 1 :(得分:0)
您是否可以在第二个视图中更改后退按钮的字体?在我看来,这导致了标题的奇怪过渡。我可以通过不仅为正常状态设置字体,还为突出显示状态设置字体来解决此问题。
UIBarButtonItem.appearance().setTitleTextAttributes([kCTFontAttributeName as NSAttributedStringKey: UIFont(name: "Futura", size: 17)!], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([kCTFontAttributeName as NSAttributedStringKey: UIFont(name: "Futura", size: 17)!], for: .highlighted)
答案 2 :(得分:0)
因此,您依赖于largeTitleDisplayMode的默认值.automatic
,并且使用prefersLargeTitles
首先是true
,然后是false
。没什么错,但是我相信.automatic
有点令人困惑,因为它将采用任何先前的值,而不是仅在导航控制器的第一个视图控制器上进行设置。
如果可以的话,我会改为:
FirstVC
与largetitleDisplayMode = .always
和prefersLargeTitle = true
SecondVC
与largeTitleDisplayMode = .never
和prefersLargeTitle = true
(是的,它必须是真的。) SecondVC必须使用prefersLargeTitle = true
,因为从Apple文档中我们可以阅读以下内容:
如果导航栏的preferredsLargeTitles属性为false,则此属性无效,并且导航项的标题始终显示为小标题。
我写了一篇文章,对该主题进行了更多的探讨,在此我还解释了如何解决.automatic
https://www.morningswiftui.com/blog/fix-large-title-animation-on-ios13