How to present different navigation title when large title collapse?

Viewed 2121

Currently, I have large titles enabled for the navigation bar with the following code in the viewdidLoad of the ViewController:

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

        let date = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "MMMM dd"
        let result = formatter.string(from: date)




        self.title = “This is a Test\n\(result)"



        var count = 0
        for item in(self.navigationController?.navigationBar.subviews)! {
            for sub in item.subviews{
                if sub is UILabel{
                    if count == 1 {
                        break;
                    }
                    let titleLab :UILabel = sub as! UILabel
                    titleLab.numberOfLines = 0
                    titleLab.text = self.title
                    titleLab.lineBreakMode = .byWordWrapping
                    count = count + 1
                }
            }

        }
        self.navigationController?.navigationBar.layoutSubviews()
        self.navigationController?.navigationBar.layoutIfNeeded()

How can I present a completely different title when the navigation bar is collapsed in a "normal state" where the bar is no longer large?

2 Answers

You can observe the bounds of the navigationBar and change the title using a check on the height of the navigationBar.

1. for Small Title, height of navigationBar = 44

2. for Large Title, height of navigationBar > 44

class VC: UIViewController {
    var observer: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.observer = self.navigationController?.navigationBar.observe(\.bounds, options: [.new], changeHandler: { (navigationBar, changes) in
            if let height = changes.newValue?.height {
                if height > 44.0 {
                    //Large Title
                    self.title = "Large Title"
                } else {
                    //Small Title
                    self.title = "Small Title"
                }
            }
        })
    }
}

enter image description here

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let heightForCollapsedNav = UINavigationController().navigationBar.frame.size.height
    let navHeight = navigationController!.navigationBar.frame.size.height
    navigationController?.navigationBar.topItem?.title = navHeight <= heightForCollapsedNav  ? "Collapsed" : "Large"
}
Related