How to change the Color of text in UITabBarItem in iOS 5

28,096

Solution 1

Do you mean this one? Keep in mind, this only works for iOS5.0 or later.

if ([self.tabBarItem respondsToSelector:@selector(setTitleTextAttributes:)]) {
    NSLog(@"*** Support method(iOS 5): setTitleTextAttributes:");
    [self.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                [UIFont fontWithName:@"AmericanTypewriter" size:20.0f], UITextAttributeFont,
                                                [UIColor blackColor], UITextAttributeTextColor,
                                                [UIColor grayColor], UITextAttributeTextShadowColor,
                                                [NSValue valueWithUIOffset:UIOffsetMake(0.0f, 1.0f)], UITextAttributeTextShadowOffset,
                                                nil]];
}

Apple's documentation on customizing appearance:

In iOS v5.0 and later, you can customize the appearance of tab bars by setting item label text attributes using appearance selectors declared by UIBarItem. You can also use the methods listed in “Customizing Appearance.” You can customize the appearance of all segmented controls using the appearance proxy (for example, [UITabBarItem appearance]), or just of a single tab bar. You can also provide finished selected and unselected images using the methods listed in “Managing the Finished Selected Image”; these methods, though, do not participate in the UIAppearance proxy API (see UIAppearance). UIKit does now provide any automatic treatment to finished images. For good results, you must provide finished selected and unselected images in matching pairs using setFinishedSelectedImage:withFinishedUnselectedImage:.

Edit: Here is another example using the UIAppearance system and the NSDictionary literal syntax:

[[UITabBarItem appearance] setTitleTextAttributes:@{
                         UITextAttributeFont : [UIFont fontWithName:@"AmericanTypewriter" size:20.0f],
                    UITextAttributeTextColor : [UIColor blackColor],
              UITextAttributeTextShadowColor : [UIColor grayColor],
             UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(0.0f, 1.0f)]}];

Edit (by @JeremyWiebe): As of iOS 6, the dictionary keys have been changed to be the same as OS X uses:

NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor grayColor];
shadow.shadowOffset = CGSizeMake(0, 1.0);

[[UITabBarItem appearance] setTitleTextAttributes:@{
                         NSFontAttributeName : [UIFont fontWithName:@"AmericanTypewriter" size:20.0f],
              NSForegroundColorAttributeName : [UIColor blackColor],
                       NSShadowAttributeName : shadow }];

Solution 2

[[UITabBarItem appearance] setTitleTextAttributes:@{
                             UITextAttributeFont : [UIFont fontWithName:@"HelveticaNeue-Bold" size:10.0f],
                        UITextAttributeTextColor : [UIColor colorWithRed:0/255.0 green:48/255.0 blue:92/255.0 alpha:1.0],}
                                         forState:UIControlStateNormal];

[[UITabBarItem appearance] setTitleTextAttributes:@{
                             UITextAttributeFont : [UIFont fontWithName:@"HelveticaNeue-Bold" size:10.0f],
                        UITextAttributeTextColor : [UIColor colorWithRed:0/255.0 green:138/255.0 blue:196/255.0 alpha:1.0],}
                                         forState:UIControlStateSelected];

Solution 3

UITextAttributeFont, UITextAttributeTextColor etc. are deprecated in iOS 7.0.

You have to use:

NSFontAttributeName, NSParagraphStyleAttributeName, NSForegroundColorAttributeName, NSBackgroundColorAttributeName, NSLigatureAttributeName, NSKernAttributeName, NSStrikethroughStyleAttributeName, NSUnderlineStyleAttributeName, NSStrokeColorAttributeName,  NSStrokeWidthAttributeName, NSShadowAttributeName and NSVerticalGlyphFormAttributeName

Solution 4

Specifically for iOS 7, try using NSForegroundColorAttributeName instead of UITextAttributeTextColor

Solution 5

Working solution for iOS 7.0+:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
    [UIColor redColor], NSForegroundColorAttributeName,
    nil] forState:UIControlStateNormal];

    [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
    [UIColor whiteColor], NSForegroundColorAttributeName,
    nil] forState:UIControlStateSelected];
}
Share:
28,096

Related videos on Youtube

Desmond
Author by

Desmond

Updated on July 09, 2022

Comments

  • Desmond
    Desmond almost 2 years

    with more appearance control in iOS 5, how do we change the UITabBarItem text color ? from default white to other color ?

    EDIT:working solution

      [[UITabBarItem appearance] setTitleTextAttributes:
             [NSDictionary dictionaryWithObjectsAndKeys:
              [UIColor blackColor], UITextAttributeTextColor, 
              [UIColor whiteColor], UITextAttributeTextShadowColor, 
              [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset, 
              [UIFont fontWithName:@"Rok" size:0.0], UITextAttributeFont, 
              nil] 
                                                  forState:UIControlStateNormal];
    
  • Kjuly
    Kjuly over 12 years
    @Desmond It can't be set in iOS4 as far as I know. However, you can customize your tabBar to do so. You can try THIS. It works excellent. ;)
  • Desmond
    Desmond over 12 years
    hi kjuly, thanks for the quick reply. i'm setting this in my app delegate with error.
  • Desmond
    Desmond over 12 years
    [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"AmericanTypewriter" size:20.0f], UITextAttributeFont, [UIColor blackColor], UITextAttributeTextColor, [UIColor grayColor], UITextAttributeTextShadowColor, [NSValue valueWithUIOffset:UIOffsetMake(0.0f, 1.0f)], UITextAttributeTextShadowOffset, nil]];
  • Desmond
    Desmond over 12 years
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIBarItemAppearance setTitleTextAttributes:]: unrecognized selector sent to instance 0x82773d0'
  • Kjuly
    Kjuly over 12 years
    @Desmond what's your build target? :? Does [self.tabBarItem setTitleTextAttributes: work?
  • Desmond
    Desmond over 12 years
    [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"Rokkitt" size:26.0], UITextAttributeFont, nil]]; worked
  • Desmond
    Desmond over 12 years
    for my nav bar, build target iOS 5.0
  • Kjuly
    Kjuly over 12 years
    @Desmond you're welcome! BTW, what cause your new error? I'm wondering. :p
  • Desmond
    Desmond over 12 years
    not too sure, i retype it instead of copying, add in forState:UIControlStateNormal too
  • Desmond
    Desmond over 12 years
    by the way how do i remove dropshadow and gradient from the tabbar icons ?
  • Kjuly
    Kjuly over 12 years
    @Desmond Maybe you can set tintColor for it just like for navigationBar. I've not tried yet. :p
  • Kjuly
    Kjuly over 12 years
    @Desmond HERE's an interesting post.
  • Ashish Ramani
    Ashish Ramani over 9 years
    1 up for simple and effective answer