I am using following method to set selection indicator for selected tab bar item. It works well for iPhone 4/4s/5/5s but not in iphone 6/6+.
[[UITabBar appearan
Here is my auto-adjusting UITabBarController
subclass. Just provide an image and it will adjust to all known iPhones and iPads. It will also update the size whenever the trait collection changes so it supports all the new iPad features and rotation.
import UIKit
class TabBarController: UITabBarController {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
updateSelectionIndicatorImage()
}
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateSelectionIndicatorImage()
}
func updateSelectionIndicatorImage() {
let width = CGRectGetWidth(tabBar.bounds) > 420 ? 420 : CGRectGetWidth(tabBar.bounds)
var selectionImage = UIImage(named: "TabSelectionIndicator")
let tabSize = CGSizeMake(width/5, 49)
UIGraphicsBeginImageContext(tabSize)
selectionImage?.drawInRect(CGRectMake(0, 0, tabSize.width, tabSize.height))
selectionImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
tabBar.selectionIndicatorImage = selectionImage
}
}
EDIT: IT seems that after all this solution should work, I had some issues with cache
UIImage *selTab = [[UIImage imageNamed:@"tabHighlight"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
CGSize tabSize = CGSizeMake(CGRectGetWidth(self.view.frame)/5, 49);
UIGraphicsBeginImageContext(tabSize);
[selTab drawInRect:CGRectMake(0, 0, tabSize.width, tabSize.height)];
UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//
[self.tabBar setSelectionIndicatorImage:reSizeImage];
tabHiglight
is a png of 82x49, I've tested with other sizes but this seems to fit best.
I divide the width
of the frame by the number of items I have in the tabBar - in my case 5, then I create a new UIImage of the "right" size and set it as the selectionIndicatorImage
.