UITabBarの色を変える

UITabBarControllerのデザインをちょこちょこ調整する必要があった。
またいつか使いそうな気がするのでメモ。
この設定はiOS7.1系以降なら問題なく動くと思う。7.0系は問題があったようななかったような。

+ (UIImage *)imageFromColor:(UIColor *)color size:(CGSize)size {
    CGRect bounds = CGRectZero;
    bounds.size = size;
    UIGraphicsBeginImageContext(bounds.size);
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(contextRef, [color CGColor]);
    CGContextFillRect(contextRef, bounds);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (void)setupTabBarAppearance {
    // タブバーアイテムの文字色を変える
    [[UITabBarItem appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName: [UIColor redColor]}
                                             forState:UIControlStateNormal];
    [[UITabBarItem appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName: [UIColor blueColor]}
                                             forState:UIControlStateSelected];
    // タブバーアイテムのアイコンを変える
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
    for (UIViewController *viewController in tabBarController.viewControllers) {
        UITabBarItem *item = viewController.tabBarItem;
        // 通常時の画像。 imageWithRenderingMode:で画像をそのまま表示するよう設定
        item.image = [[UIImage imageNamed:@"first"] imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)];
        // 選択時の画像。 デフォルト。
        item.selectedImage = [UIImage imageNamed:@"first"];
    }
    
    // タブバーの背景色を設定
    [[UITabBar appearance] setBarTintColor:[UIColor whiteColor]];
    // 選択されたタブバーアイテムの背景色を設定
    CGFloat tabBarItemWidth = CGRectGetWidth(self.window.frame)/tabBarController.viewControllers.count;
    CGSize tabBarItemSize = CGSizeMake(tabBarItemWidth, CGRectGetHeight(tabBarController.tabBar.frame));
    UIImage *selectedTabBarImage = [[self class] imageFromColor:[UIColor purpleColor] size:tabBarItemSize];
    [[UITabBar appearance] setSelectionIndicatorImage:selectedTabBarImage];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [self setupTabBarAppearance];
    return YES;
}

結果

画像のfirstはTabBarBaseのプロジェクトサンプルに最初から入っている画像(画像というか、vectorのPDFが入っている