导航栏中从大标题到小标题的切换不流畅iOS 13

时间:2019-10-09 09:06:48

标签: ios swift uinavigationcontroller uinavigationbar

我有一个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 13

iOS 12

iOS 12

4 个答案:

答案 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()
       }
 }