简体   繁体   中英

Hide Back Button Title on iOS 13

Our application has a deployment target of iOS 10. We're hiding all back button titles (for the entire app) with the following code

let attributes: [NSAttributedString.Key : Any] = [
    .font : UIFont.systemFont(ofSize: 0.001),
    .foregroundColor: UIColor.clear
]

let barButtonItemAppearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self])
barButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
barButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

This worked up until iOS 13, where the back button titles are no longer hidden.

I saw the WWDC 2019 video about the new apperance APIs, but as far as I can tell it only told me how to use the new APIs for a single navigation bar (and not for the entire app).

How can I achieve this?

Add in viewDidLoad() method of the parent(previous in the stack) controller.

self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)

In the next screen, only the arrow image will be presented.

or you can put this code before pushViewController method, for example

func presentNextScreen(_ controller: UIViewController){
   // Suppress title in the back button on the next screen.
   self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
   self.navigationController?.pushViewController(controller, animated: true) 
}

For me, the easiest way to hide the title in the back button is to configure the appearance of UINavigationBar

if #available(iOS 13.0, *) {
            let standartAppearence = UINavigationBarAppearance()
            standartAppearence.configureWithDefaultBackground()

            let backButtonAppearence = UIBarButtonItemAppearance()
            let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.clear]
            backButtonAppearence.normal.titleTextAttributes = titleTextAttributes
            backButtonAppearence.highlighted.titleTextAttributes = titleTextAttributes
            standartAppearence.backButtonAppearance = backButtonAppearence

            UINavigationBar.appearance().standardAppearance = standartAppearence
            UINavigationBar.appearance().compactAppearance = standartAppearence
            UINavigationBar.appearance().scrollEdgeAppearance = standartAppearence
        }

In addition, here you can add any other configuration of the navigation bar

A workaround: Create a base class: BaseViewController.

class BaseViewController: UIViewController {

func hideBackButton() {
    self.navigationItem.leftBarButtonItem = nil
}

func hideCloseButton() {
    self.navigationItem.rightBarButtonItem = nil
}

override public func viewDidLoad() {
    super.viewDidLoad()
    addNavigationButtons()
}

func addNavigationButtons() {
    let backButton = UIBarButtonItem(image: UIImage(named: "back"), style: .plain, target: self, action: #selector(goBack))
    self.navigationItem.leftBarButtonItem = backButton

    let closeButton = UIBarButtonItem(image: UIImage(named: "close"), style: .plain, target: self, action: #selector(closeTheFlow))
    self.navigationItem.rightBarButtonItem = closeButton
}

@objc func goBack() {
    //Go Back
}

@objc func closeTheFlow() {
    //Close
}

Make every ViewController a subclass of BaseViewController. You could do anything with the right and left buttons in the entire app.

I hide title gloabal. a trick

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -UIScreen.main.bounds.size.width, vertical: 0), for: UIBarMetrics.default)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM