iOS14 navigationItem.largeTitleDisplayMode = .总是不行

iOS14 navigationItem.largeTitleDisplayMode = .always not work

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

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

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

navigationItem.largeTitleDisplayMode = .never

当我return从DetailViewControllerViewController时,在ViewController中显示小标题而不是大标题。此代码在 iOS12 和 iOS13 中是正确的。如何使 ViewController 始终在 iOS14 上显示大标题?

目前正在使用来自 App Store 的Xcode12

使用我的分机:

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)
}

这是结果:

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

This link explains and solves the problem

ViewControllerviewDidLoad

中添加view.addSubview(UIView())

对于iOS14,需要添加sizeToFit函数。 以下代码始终有效。

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

问题终于解决了

有机会解决这个问题

如果您使用大标题,并且在同一个视图控制器上有多个滚动视图。 导航栏将监听 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)
}

或通过故事板: