I think you should use a custom view. See this example using a 40x40 button
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0,0,40,40);
[button setBackgroundImage:[UIImage imageNamed:@"button.png"] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:@"buttonSelected.png"] forState:UIControlStateSelected];
[button addTarget:self action:@selector(didTouchButton:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:buttonItem, nil]];
And in the touch set selected
- (void) didTouchButton:(id)sender
{
UIButton *button = (UIButton*)sender;
button.selected = YES;
//Do stuff
}