I have a ViewController
and a DetailViewController
, in the ViewDidLoad
of the ViewController
I set the following code, the purpose is to make the ViewController
always use the large title
self.navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always
In the ViewDidLoad
of the DetailViewController
I set the following code, the purpose is to make the DetailViewController
not use the large title
navigationItem.largeTitleDisplayMode = .never
When I return from DetailViewController
to ViewController
, the small title is displayed instead of the large title in ViewController
. This code is correct in iOS12 and iOS13. How to make the ViewController
always display the large title on iOS14?
Currently using Xcode12 from the App Store
At last solved the issue.
If you're using large title, and you have multiple scroll views on the same view controller. Navigation bar will listen to scroll actions on the subviews (immediate subview) of kind UIScrollView.
You have to prevent current view controller's large title collapsing feature.
Its same concept as @BaQiWL mentioned. But not just adding view.addSubview(UIView())
will solve this issue, if you're using storyboard.
To do this you have to add view as Viewcontroller's first subview. (view.sendSubviewToBack
does the trick).
// Call this method on `viewDidLoad`
private func preventLargeTitleCollapsing() {
let dummyView = UIView()
view.addSubview(dummyView)
view.sendSubviewToBack(dummyView)
}
OR via Storyboard:
For iOS 14, need to add sizeToFit function. Below code always work.
navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationBar.sizeToFit()
My ViewController
has a UIPageViewController
, UIPageViewController
has a UIScrollView
, this is the key point.
This link explains and solves the problem
add view.addSubview(UIView())
in ViewController
's viewDidLoad
If the scene is based on a UITableView, you need to scroll it.
override func viewDidLoad() {
super.viewDidLoad()
// enough for the first scene.
navigationController?.navigationBar.prefersLargeTitles = true
tableView.setContentOffset(CGPoint(x: 0, y: -1), animated: false) // hack for modal prefersLargeTitles
}
always present largeTitleDisplayMode for modal view controller
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With