Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS change navigation bar title font and color

So i have this code that should change the nav bar title font, but it doenst

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont                                                                        fontWithName:_dataManager.optionsSettings.fontString size:14], NSFontAttributeName,                             [UIColor whiteColor], NSForegroundColorAttributeName, nil];  [[UINavigationBar appearance] setTitleTextAttributes:attributes]; 

Changing the back button font with this code works just fine.

   //set backbutton font NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:                                   [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,                                   nil]; [[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes                                             forState:UIControlStateNormal]; 
like image 631
aZtraL-EnForceR Avatar asked Nov 05 '13 14:11

aZtraL-EnForceR


People also ask

Can you change Iphone navigation bar?

A user changes the navigation bar's style, or UIBarStyle , by tapping the “Style” button to the left of the main page. This button opens an action sheet where users can change the background's appearance to default, black-opaque, or black- translucent.


2 Answers

The correct way to change the title font (and color) is:

[self.navigationController.navigationBar setTitleTextAttributes:  @{NSForegroundColorAttributeName:[UIColor redColor], NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21]}]; 

Edit: Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red,  NSAttributedString.Key.font: UIFont(name: "mplus-1c-regular", size: 21)!] 

Edit: Swift 4

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.red,  NSAttributedStringKey.font: UIFont(name: "mplus-1c-regular", size: 21)!] 

Swift 3:

self.navigationController?.navigationBar.titleTextAttributes =  [NSForegroundColorAttributeName: UIColor.redColor(),  NSFontAttributeName: UIFont(name: "mplus-1c-regular", size: 21)!] 

Swift 5:

navigation.navigationBar.titleTextAttributes = [     .foregroundColor: UIColor.red,     .font: UIFont(name: "mplus-1c-regular", size: 21)! ] 
like image 85
Brian Avatar answered Sep 27 '22 17:09

Brian


There is nothing wrong with the other answers. I'm just sharing the storyboard version for setting the font.

1. Select Your Navigation Bar within your Navigation Controller

navbar

2. Change the Title Font in the Attributes Inspector

title-font

(You will likely need to toggle the Bar Tint for the Navigation Bar before Xcode picks up the new font)

Notes (Caveats)

Verified that this does work on Xcode 7.1.1+. (See the Samples below)

  1. You do need to toggle the nav bar tint before the font takes effect (seems like a bug in Xcode; you can switch it back to default and font will stick)
  2. If you choose a system font ~ Be sure to make sure the size is not 0.0 (Otherwise the new font will be ignored)

size

  1. Seems like this works with no problem when only one NavBar is in the view hierarchy. It appears that secondary NavBars in the same stack are ignored. (Note that if you show the master navigation controller's navBar all the other custom navBar settings are ignored).

Gotchas (deux)

Some of these are repeated which means they are very likely worth noting.

  1. Sometimes the storyboard xml gets corrupt. This requires you to review the structure in Storyboard as Source Code mode (right click the storyboard file > Open As ...)
  2. In some cases the navigationItem tag associated with user defined runtime attribute was set as an xml child of the view tag instead of the view controller tag. If so remove it from between the tags for proper operation.
  3. Toggle the NavBar Tint to ensure the custom font is used.
  4. Verify the size parameter of the font unless using a dynamic font style
  5. View hierarchy will override the settings. It appears that one font per stack is possible.

Result

navbar-italic

Samples

  • Video Showing Multiple Fonts In Advanced Project
  • Simple Source Download
  • Advanced Project Download ~ Shows Multiple NavBar Fonts & Custom Font Workaround
  • Video Showing Multiple Fonts & Custom Fonts

Handling Custom Fonts

Note ~ A nice checklist can be found from the Code With Chris website and you can see the sample download project.

If you have your own font and want to use that in your storyboard, then there is a decent set of answers on the following SO Question. One answer identifies these steps.

  1. Get you custom font file(.ttf,.ttc)
  2. Import the font files to your Xcode project
  3. In the app-info.plist,add a key named Fonts provided by application.It's an array type , add all your font file names to the array,note:including the file extension.
  4. In the storyboard , on the NavigationBar go to the Attribute Inspector,click the right icon button of the Font select area.In the popup panel , choose Font to Custom, and choose the Family of you embeded font name.

Custom Font Workaround

So Xcode naturally looks like it can handle custom fonts on UINavigationItem but that feature is just not updating properly (The font selected is ignored).

UINavigationItem

To workaround this:

One way is to fix using the storyboard and adding a line of code: First add a UIView (UIButton, UILabel, or some other UIView subclass) to the View Controller (Not the Navigation Item...Xcode is not currently allowing one to do that). After you add the control you can modify the font in the storyboard and add a reference as an outlet to your View Controller. Just assign that view to the UINavigationItem.titleView. You could also set the text name in code if necessary. Reported Bug (23600285).

@IBOutlet var customFontTitleView: UIButton!  //Sometime later...     self.navigationItem.titleView = customFontTitleView 
like image 26
Tommie C. Avatar answered Sep 27 '22 15:09

Tommie C.