iosuitabbaruitabbaritem

Changing selected TabBarItem font iOS


I have a TabBar. I am trying to style it so that the titles on the TabBarItems have different fonts for the normal state and the selected state. For normal state I want Helvetica Neue Light and for the selected state I want Helvetica Neue Medium. No matter what I do, I can't seem to get the fonts to be different for these two states. The color changing works fine. Here is what I currently have:

  // Set the tab bar title appearance for normal state.
  [[UITabBarItem appearance] setTitleTextAttributes:@{
     NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light"
                                          size:16],
     NSForegroundColorAttributeName: [CMK8Colors grayColor]
   }
                                           forState:UIControlStateNormal];

  // Set the tab bar title appearance for selected state.
  [[UITabBarItem appearance] setTitleTextAttributes:@{
     NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Medium"
                                          size:16],
     NSForegroundColorAttributeName: [CMK8Colors blueColor]
   }
                                           forState:UIControlStateSelected];

Please help.


Solution

  • Good news and bad news.

    Bad news, It's a little harder than just using the appearance proxy.

    Good news It's not that much harder!

    Header

    #import <UIKit/UIKit.h>
    
    @interface MYTabbyViewController : UITabBarController
    
    @end
    

    Implementation

    #import "MYTabbyViewController.h"
    
    @implementation MYTabbyViewController
    
    -(void)setSelectedViewController:(UIViewController *)selectedViewController
    {
        [super setSelectedViewController:selectedViewController];
    
        for (UIViewController *viewController in self.viewControllers) {
            if (viewController == selectedViewController) {
                [viewController.tabBarItem setTitleTextAttributes:@{
                                                        NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Medium" size:16],
                                                        NSForegroundColorAttributeName: [UIColor blueColor]
                                                        }
                                             forState:UIControlStateNormal];
            } else {
                [viewController.tabBarItem setTitleTextAttributes:@{
                                                        NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:16],
                                                        NSForegroundColorAttributeName: [UIColor grayColor]
                                                        }
                                             forState:UIControlStateNormal];
            }
        }
    }
    

    The last part you will need is to use this subclass instead of the out-of-the-box UITabBarController. If you are using Storyboards, simply select the TabBarController, go to the Identity Inspector (third subtab in the right panel) and change UITabBarController to MYTabBarController or what have you.

    But yeah! Bottom line, just update the ViewController tabBarItem!