Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS14 navigationItem.largeTitleDisplayMode = .always not work

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

like image 362
BaQiWL Avatar asked Sep 22 '20 07:09

BaQiWL


4 Answers

At last solved the issue.

Edge case:

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.

Solution

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:

enter image description here

like image 168
Lal Krishna Avatar answered Oct 23 '22 02:10

Lal Krishna


For iOS 14, need to add sizeToFit function. Below code always work.

navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationBar.sizeToFit()
like image 29
Symon Avatar answered Oct 23 '22 03:10

Symon


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

like image 31
BaQiWL Avatar answered Oct 23 '22 01:10

BaQiWL


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

like image 23
Sergey Sergeyev Avatar answered Oct 23 '22 02:10

Sergey Sergeyev