大标题转为常规标题并返回

时间:2018-08-06 14:24:30

标签: ios swift uinavigationcontroller uinavigationbar

我想要一个带有大标题的视图,然后推另一个带有常规标题的视图,然后再回到带有大标题的视图。

我尝试在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
  }

}

3 个答案:

答案 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有点令人困惑,因为它将采用任何先前的值,而不是仅在导航控制器的第一个视图控制器上进行设置。

如果可以的话,我会改为:

  • FirstVClargetitleDisplayMode = .alwaysprefersLargeTitle = true
  • SecondVClargeTitleDisplayMode = .neverprefersLargeTitle = true(是的,它必须是真的。)

SecondVC必须使用prefersLargeTitle = true,因为从Apple文档中我们可以阅读以下内容:

  

如果导航栏的preferredsLargeTitles属性为false,则此属性无效,并且导航项的标题始终显示为小标题。

我写了一篇文章,对该主题进行了更多的探讨,在此我还解释了如何解决.automatic https://www.morningswiftui.com/blog/fix-large-title-animation-on-ios13