iOS14 navigationItem.largeTitleDisplayMode = .总是不行
iOS14 navigationItem.largeTitleDisplayMode = .always not work
我有一个ViewController
和一个DetailViewController
,在ViewDidLoad
的ViewController
我设置了下面的代码,目的是让ViewController
总是使用大标题
self.navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
在DetailViewController
的ViewDidLoad
中我设置了如下代码,目的是让DetailViewController
不使用大标题
navigationItem.largeTitleDisplayMode = .never
当我return从DetailViewController
到ViewController
时,在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
有一个UIPageViewController
,UIPageViewController
有一个UIScrollView
,这是重点
This link explains and solves the problem
在ViewController
的viewDidLoad
中添加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)
}
或通过故事板:
我有一个ViewController
和一个DetailViewController
,在ViewDidLoad
的ViewController
我设置了下面的代码,目的是让ViewController
总是使用大标题
self.navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
在DetailViewController
的ViewDidLoad
中我设置了如下代码,目的是让DetailViewController
不使用大标题
navigationItem.largeTitleDisplayMode = .never
当我return从DetailViewController
到ViewController
时,在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
有一个UIPageViewController
,UIPageViewController
有一个UIScrollView
,这是重点
This link explains and solves the problem
在ViewController
的viewDidLoad
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)
}
或通过故事板: