As UITabBarItem is a subclass of UIBarItem, working with it is painful because UIBarItem doesn't subclass UIView. However, it does contain one. What follows manipulates that view in order to change the background colour of a UITabBarItem, and therefore might be rejected if submitted to the AppStore.

UPDATE: As of iOS 7.1 this technique no longer works (if the user taps the same tab twice in succession, the background colour is cleared). <!--more-->

1. Subclass UITabBarItem

Create a subclass of UITabBarItem and add a new selected property to its header, like so:

@interface ALDTabBarItem : UITabBarItem
@property (nonatomic, assign, getter = isSelected) BOOL selected;

UITabBarItems have a view property, but it isn't exposed. We can extend the class to access it, and then create a custom setter on the selected property to change the background colour, like so:

#import "ALDTabBarItem.h"

@interface ALDTabBarItem (ALD)
@property (nonatomic, strong) UIView *view;

@implementation ALDTabBarItem

- (void)setSelected:(BOOL)selected
        self.view.backgroundColor = [UIColor redColor];
        self.view.backgroundColor = [UIColor clearColor];


2. Update your UITabBarController delegate

Add the following code to the delegate of your UITabBarController, which sets the selected states of the UITabBar:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
    for(ALDTabBarItem *myItem in tabBar.items)
        myItem.selected = (myitem == item);

I'm planning on submitting an App that uses this technique, so I'll update this post when Apple either accept or reject the App. I've also submitted this answer to Stack Overflow, so perhaps others might comment on their AppStore acceptance/rejection.