【问题标题】:iOS14 navigationItem.largeTitleDisplayMode = .always not workiOS14 navigationItem.largeTitleDisplayMode = .always 不工作
【发布时间】:2021-01-08 07:35:00
【问题描述】:

我有一个ViewController和一个DetailViewController,在ViewControllerViewDidLoad中我设置了如下代码,目的是让ViewController总是使用大标题

self.navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always

DetailViewControllerViewDidLoad中我设置了如下代码,目的是让DetailViewController不使用大标题

navigationItem.largeTitleDisplayMode = .never

当我从DetailViewController 返回到ViewController 时,在ViewController 中显示的是小标题而不是大标题。此代码在 iOS12 和 iOS13 中是正确的。如何让ViewController在iOS14上一直显示大标题?

目前正在使用 App Store 中的 Xcode12

【问题讨论】:

    标签: ios uinavigationcontroller uinavigationbar ios14


    【解决方案1】:

    对于 iOS 14,需要添加 sizeToFit 功能。 下面的代码总是有效的。

    navigationController?.navigationBar.prefersLargeTitles = true
    navigationController?.navigationBar.sizeToFit()
    

    【讨论】:

    • 它不适合我。我刚刚在 VC-1 的 didload 上调用了这个,然后就会出现。
    • 这确实有效,但是当从其他具有小导航栏的视图控制器返回时,将小导航标题更改为大导航标题时显示了一些故障。它没有显示过渡动画。您能否就此提出一些建议。
    【解决方案2】:

    终于解决了这个问题。

    当有机会出现这个问题时

    如果您使用大标题,并且在同一个视图控制器上有多个滚动视图。 导航栏会监听 UIScrollView 类子视图的滚动动作。

    解决方案

    您必须防止当前视图控制器的大标题折叠功能。

    它与@BaQiWL 提到的概念相同。但是,如果您使用故事板,则不仅添加 view.addSubview(UIView()) 可以解决此问题。

    为此,您必须将视图添加为 Viewcontroller 的第一个子视图。 (view.sendSubviewToBack 成功了)。

    // Call this method on `viewDidLoad`
    private func preventLargeTitleCollapsing() {
        let dummyView = UIView()
        view.addSubview(dummyView)
        view.sendSubviewToBack(dummyView)
    }
    

    或通过情节提要:

    【讨论】:

      【解决方案3】:

      我的ViewController有一个UIPageViewControllerUIPageViewController有一个UIScrollView,这是重点。

      This link explains and solves the problem

      ViewControllerviewDidLoad中添加view.addSubview(UIView())

      【讨论】:

      • 我确实有同样的情况。但是添加子视图并没有解决我的问题。尝试添加到 ViewCONtrollerA 以及 pageviewcontroller 中的 viewcontroller。
      【解决方案4】:

      使用我的扩展:

      extension UIViewController {
      func configureNavigationBar(largeTitleColor: UIColor, backgoundColor: UIColor, tintColor: UIColor, title: String, preferredLargeTitle: Bool) {
      if #available(iOS 13.0, *) {
          let navBarAppearance = UINavigationBarAppearance()
          navBarAppearance.configureWithOpaqueBackground()
          navBarAppearance.largeTitleTextAttributes = [.foregroundColor: largeTitleColor]
          navBarAppearance.titleTextAttributes = [.foregroundColor: largeTitleColor]
          navBarAppearance.backgroundColor = backgoundColor
      
          navigationController?.navigationBar.standardAppearance = navBarAppearance
          navigationController?.navigationBar.compactAppearance = navBarAppearance
          navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
      
          navigationController?.navigationBar.prefersLargeTitles = preferredLargeTitle
          navigationController?.navigationBar.isTranslucent = false
          navigationController?.navigationBar.tintColor = tintColor
          navigationItem.title = title
      
      } else {
          // Fallback on earlier versions
          navigationController?.navigationBar.barTintColor = backgoundColor
          navigationController?.navigationBar.tintColor = tintColor
          navigationController?.navigationBar.isTranslucent = false
          navigationItem.title = title
        }
       }
      }
      

      在 viewWillAppear 中设置导航栏:

      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
          configureNavigationBar(largeTitleColor: .white, backgoundColor: .yourColor, tintColor: .white, title: "YourTitle", preferredLargeTitle: true)
      }
      

      现在调用显示你的细节控制器的函数:

      @objc func DetailController(){
          let controller = DetailViewController()
          controller.navigationItem.largeTitleDisplayMode = .never
          navigationController?.pushViewController(controller, animated: true)
      }
      

      这是结果:

      【讨论】:

      • 谢谢,但是Xcode12和iOS14还是不行,你用的是Xcode12和iOS14吗?
      • 是的,它工作正常....看看我的新图片答案
      • 你在用我的扩展吗?删除所有导航栏设置并使用扩展程序,它就像一个魅力......
      • 非常感谢,我在新项目中测试了你的代码,没有问题,应该是我老项目下的代码有问题
      • @BaQiWL 祝你有美好的一天:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      相关资源
      最近更新 更多