How can I change the font of the back button for my navigation bar?

后端 未结 6 1345
隐瞒了意图╮
隐瞒了意图╮ 2020-11-29 03:02

How can I change the font of the back button for my navigation bar.

The back button is either \"back\" or the title from the previous view controller.

I tho

相关标签:
6条回答
  • 2020-11-29 03:22

    SWIFT 3

        UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!,NSForegroundColorAttributeName: UIColor.white]
        UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!], for: UIControlState.normal)
    
    0 讨论(0)
  • 2020-11-29 03:26

    If you need to change font style entirely across you app (aka. each navigation button), preferred method is to use UIBarButtonItem.appearance() proxy.

    Sample code snippet would look like this:

    SWIFT 3.0+

    //make sure font name u use below *actually* exists in the system !
    //if it doesn't app will crash because we're force unwrapping an optional (see below) !!!
    let customFont = UIFont(name: "customFontName", size: 17.0)!
    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], for: .normal)
    

    It is wise to put this code snippet somewhere at the beginning of your AppDelegate.swift file because font stylization has to happen each time the app launches. Also, you're safe to put this code in any other place (eg. Presenter class) where you do your UI stylization and customization. As soon as this code gets executed, all your BarButtons will be customized thereafter.


    BUT as a true Swift

    0 讨论(0)
  • 2020-11-29 03:30

    When you are sure you've already set a UIBarButtonItem you can do:

    self.navigationItem.leftBarButtonItem!.title = "myTitle"
    

    To change e.g. the color you can do the following:

    self.navigationItem.leftBarButtonItem!.tintColor = UIColor.redColor()
    

    When you haven't set it in your storyboard you can do:

    self.navigationItem.leftBarButtonItem = UIBarButtonItem()
    

    For changing the font, do the following:

    self.navigationItem.leftBarButtonItem!.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: .Normal)
    

    Maybe I should mention that you mustn't use self.navigationController because when setting the navigationController's buttons they aren't displayed on the screen so as a result the buttons which are on the screen and had been set in the storyboard have to be self.navigationItem...

    0 讨论(0)
  • 2020-11-29 03:35

    Just tested your code and it seems the reason that line is returning nil is actually because name: "FONTNAME" returns nil. So if you set that name attribute to a valid font name, the code should run without an error -- even if navigationController?.navigationItem.leftBarButtonItem is explicitly set to nil.

    But regardless, also as I've seen through testing, this line won't give you the result you apparently want. The leading navigationController optional shouldn't be there since it accesses your UINavigationController and not the current view. Simply use the UIViewController's own navigationItem property to access its leftBarButtonItem directly, ex:

    let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
    navigationItem.leftBarButtonItem = backButton
    navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)
    

    Edit: From the comment you posted under this answer, it seems as if you don't actually want to set the leftBarButtonItem but the backBarButtonItem because you don't want to implement a custom action beyond going back to the previous view controller.

    So in that previous view controller (i.e. the view before you want to show your custom back button item), you can set your custom back button without an action like so:

    let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
    backButton.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)
    navigationItem.backBarButtonItem = backButton
    
    0 讨论(0)
  • 2020-11-29 03:36

    For iOS 13, Swift 5.1:

    let fontAttr = [NSAttributedString.Key.font: \*your font*\]
    
    let buttonAppearance = UIBarButtonItemAppearance()
    buttonAppearance.normal.titleTextAttributes = fontAttr
    
    let navbarAppearance = UINavigationBarAppearance()
    navbarAppearance.buttonAppearance = buttonAppearance
    UINavigationBar.appearance().standardAppearance = navbarAppearance
    
    0 讨论(0)
  • 2020-11-29 03:39

    If you want to apply this change to all of your application you can use below code:

    Swift 4

    I've added these lines to AppDelegate.swift in application function :

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
           UINavigationBar.appearance().titleTextAttributes = [
                NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 20)!
            ]
    
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)
    
      return true
    }
    

    Swift 3

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        UINavigationBar.appearance().titleTextAttributes = [
            NSFontAttributeName: UIFont(name: "IranSansMobile", size: 20)!
        ]
    
        UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)
    
    
        return true
    }
    
    0 讨论(0)
提交回复
热议问题