本文转载自:http://blog.sina.com.cn/s/blog_79c5bdc30100t88i.html
我自己实现的一种可以很方便的实现更换TabBarController图片的方法,代码如下:
#import <UIKit/UIKit.h> @interface CustomTabBarViewController : UITabBarController { UIImage *_tabBarBackgroundImage; //整个tabBar的背景 NSMutableArray *_unSelectedImageArray; //非选中效果的tabBarItem数组 NSMutableArray *_selectedImageArray; //选中效果的tabBarItem数组 NSMutableArray *_itemBgImageViewArray; //item背景UIIMageView数组 int _lastSelectedIndex; //上一次选中的tabBarItem的index int _hiddenIndex; } @property (nonatomic, retain) UIImage *tabBarBackgroundImage; @property (nonatomic, retain) NSMutableArray *unSelectedImageArray; @property (nonatomic, retain) NSMutableArray *selectedImageArray; @property (nonatomic, retain) NSMutableArray *itemBgImageViewArray; @property (nonatomic, assign) int lastSelectedIndex; @property (nonatomic, assign) int hiddenIndex; - (id)initWithTabBarBackgroundImage:(UIImage *)barBackgroundImage unSelectedImageArray:(NSMutableArray *)unImageArray selectedImageArray:(NSMutableArray *)imageArray; //隐藏某个tabBarItem的图片 -(void)hiddeItemImageView:(int)index; //显示某个tabBarItem的图片 -(void)showItemImageView:(int)index; @end
二
#import "CustomTabBarViewController.h" #define TabBarBackgroundImageViewTag 11111 @implementation CustomTabBarViewController @synthesize tabBarBackgroundImage = _tabBarBackgroundImage; @synthesize unSelectedImageArray = _unSelectedImageArray; @synthesize selectedImageArray = _selectedImageArray; @synthesize itemBgImageViewArray = _itemBgImageViewArray; @synthesize lastSelectedIndex = _lastSelectedIndex; @synthesize hiddenIndex = _hiddenIndex; - (void)dealloc { self.tabBarBackgroundImage = nil; self.unSelectedImageArray = nil; self.selectedImageArray = nil; self.itemBgImageViewArray = nil; [super dealloc]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. self.tabBarBackgroundImage = nil; } - (id)initWithTabBarBackgroundImage:(UIImage *)barBackgroundImage unSelectedImageArray:(NSMutableArray *)unImageArray selectedImageArray:(NSMutableArray *)imageArray { self = [super init]; if (self) { // self.tabBarBackgroundImage = barBackgroundImage; // self.unSelectedImageArray = unImageArray; // self.selectedImageArray = imageArray; // // self.itemBgImageViewArray = [NSMutableArray array]; // _lastSelectedIndex = 0; // _hiddenIndex = -1; } return self; } - (id)init { self = [super init]; if (self) { // self.tabBarBackgroundImage = [UIImage imageNamed:@"menu_bg.png"]; // // NSMutableArray *aunSelectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"menu_paiyou.png"], // [UIImage imageNamed:@"menu_chat.png"], // [UIImage imageNamed:@"menu_map.png"], // [UIImage imageNamed:@"menu_renwu.png"], // [UIImage imageNamed:@"menu_huibao.png"], nil]; // self.unSelectedImageArray = aunSelectedImageArray; // [aunSelectedImageArray release]; // // NSMutableArray *aselectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"menu_paiyou_pressed.png"], // [UIImage imageNamed:@"menu_chat_pressed.png"], // [UIImage imageNamed:@"menu_map_pressed.png"], // [UIImage imageNamed:@"menu_renwu_pressed.png"], // [UIImage imageNamed:@"menu_huibao_pressed.png"], nil]; // self.selectedImageArray = aselectedImageArray; // [aselectedImageArray release]; // // self.itemBgImageViewArray = [NSMutableArray array]; // _lastSelectedIndex = 0; // _hiddenIndex = -1; } return self; } #pragma mark - itemIndex methods - (void)setLastSelectedIndex:(int)lastSelectedIndex { if (_lastSelectedIndex != lastSelectedIndex) { //将上次的选中效果取消 UIImageView *lastSelectedImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:_lastSelectedIndex];; lastSelectedImageView.image = [_unSelectedImageArray objectAtIndex:_lastSelectedIndex]; _lastSelectedIndex = lastSelectedIndex; } } - (void)setSelectedIndex:(NSUInteger)selectedIndex { [super setSelectedIndex:selectedIndex]; //将上次的选中效果取消 self.lastSelectedIndex = selectedIndex; //将本次的选中效果显示 UIImageView *selectedImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:selectedIndex]; selectedImageView.image = [_selectedImageArray objectAtIndex:selectedIndex]; } //隐藏某个tabBarItem的图片 - (void)hiddeItemImageView:(int)index { if (_hiddenIndex != index) { _hiddenIndex = index; UIImageView *hiddenImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:_hiddenIndex]; hiddenImageView.hidden = YES; } } //显示某个tabBarItem的图片 - (void)showItemImageView:(int)index { if (_hiddenIndex == index) { UIImageView *hiddenImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:_hiddenIndex]; hiddenImageView.hidden = NO; _hiddenIndex = -1; } } #pragma mark - View lifecycle // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { [super loadView]; self.tabBarBackgroundImage = [UIImage imageNamed:@"menu_bg.png"]; NSMutableArray *aunSelectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImageimageNamed:@"menu_paiyou.png"], [UIImage imageNamed:@"menu_chat.png"], [UIImage imageNamed:@"menu_map.png"], [UIImage imageNamed:@"menu_renwu.png"], [UIImage imageNamed:@"menu_huibao.png"], nil]; self.unSelectedImageArray = aunSelectedImageArray; [aunSelectedImageArray release]; NSMutableArray *aselectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImageimageNamed:@"menu_paiyou_pressed.png"], [UIImage imageNamed:@"menu_chat_pressed.png"], [UIImage imageNamed:@"menu_map_pressed.png"], [UIImage imageNamed:@"menu_renwu_pressed.png"], [UIImage imageNamed:@"menu_huibao_pressed.png"], nil]; self.selectedImageArray = aselectedImageArray; [aselectedImageArray release]; self.itemBgImageViewArray = [NSMutableArray array]; _lastSelectedIndex = 0; _hiddenIndex = -1; } #define ItemWidth 50 #define ItemHeight 49 #define SideMarginX 7 #define SideMarginY 0.5 #define Spacing 14 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; UIImageView *tabBarBackgroundImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0,self.tabBar.frame.size.width, self.tabBar.frame.size.height)]; tabBarBackgroundImageView.tag = TabBarBackgroundImageViewTag; tabBarBackgroundImageView.contentMode = UIViewContentModeScaleAspectFit; tabBarBackgroundImageView.image = _tabBarBackgroundImage; [self.tabBar insertSubview:tabBarBackgroundImageView atIndex:0]; [tabBarBackgroundImageView release]; for (int i = 0; i < 5; i++) { UIImageView *itemBg = [[UIImageView alloc] initWithFrame:CGRectMake(SideMarginX +ItemWidth * i + Spacing * i, SideMarginY, ItemWidth, ItemHeight)]; itemBg.contentMode = UIViewContentModeScaleAspectFit; itemBg.image = [_unSelectedImageArray objectAtIndex:i]; [self.tabBar insertSubview:itemBg atIndex:1]; [_itemBgImageViewArray addObject:itemBg]; [itemBg release]; } self.selectedIndex = 0; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; self.itemBgImageViewArray = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } #pragma mark - UITabBarDelegate - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { self.selectedIndex = [tabBar.items indexOfObject:item]; } @end
other
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #import <UIKit/UIKit.h> 2 #import <QuartzCore/QuartzCore.h> 3 4 @interface XDTabBarController : UIViewController//UITabBarController 5 { 6 NSMutableArray *itemButtons; 7 int currentSelectedIndex; 8 UIView *customTabBarView; 9 UIImageView *tabBarBgImgView; 10 UIImageView *slideBg; 11 12 NSArray *viewControllers; 13 UINavigationController *contentNavigation; 14 } 15 16 @property (nonatomic, strong) UIView *customTabBarView; 17 @property (nonatomic, strong) NSMutableArray *itemButtons; 18 @property (nonatomic, assign) int currentSelectedIndex; 19 @property (nonatomic, strong) NSArray *viewControllers; 20 21 - (void)setControllers: (NSArray *)array; 22 23 @end
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#import "XDTabBarController.h" //首页 #define KLogoViewHeight 40 #define KCustomTabBarHeight 44 #define KTypeScrollViewHeight 30 #define KPictureScrollerViewHeight 130 #define KNewListHeight (460 - KCustomTabBarHeight - KLogoViewHeight - KTypeScrollViewHeight) static BOOL FIRSTTIME =YES; @interface XDTabBarController () - (void)customTabBar; - (void)slideTabItemBg:(UIButton *)button; - (void)selectedTabItem: (UIButton *)button; @end @implementation XDTabBarController @synthesize customTabBarView; @synthesize itemButtons; @synthesize currentSelectedIndex; @synthesize viewControllers; - (void)setControllers: (NSArray *)array { viewControllers = array; contentNavigation = [[UINavigationController alloc] initWithRootViewController: [array objectAtIndex:0]]; [self.view addSubview: contentNavigation.view]; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear: animated]; if (FIRSTTIME) { slideBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"selectedTabbarItemBg.png"]];//选中时阴影层 slideBg.alpha = 0.5; [self customTabBar]; FIRSTTIME = NO; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } #pragma mark - custom methods - (void)customTabBar { CGRect tabBarFrame = CGRectMake(0, self.view.frame.size.height - KCustomTabBarHeight, 320, KCustomTabBarHeight); customTabBarView = [[UIView alloc] initWithFrame: tabBarFrame]; tabBarBgImgView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, 320, KCustomTabBarHeight)]; tabBarBgImgView.image = [UIImage imageNamed:@"tabBarBg.png"]; [customTabBarView addSubview: tabBarBgImgView]; //创建按钮 int viewCount = viewControllers.count > 5 ? 5 : viewControllers.count; self.itemButtons = [NSMutableArray arrayWithCapacity:viewCount]; double _width = 320 / viewCount; double _height = KCustomTabBarHeight; for (int i = 0; i < viewCount; i++) { UIViewController *v = [viewControllers objectAtIndex:i]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.tag = i; btn.frame = CGRectMake(i * _width, 0, _width, _height); [btn addTarget:self action:@selector(selectedTabItem:) forControlEvents: UIControlEventTouchUpInside]; [btn setImage:v.tabBarItem.image forState:UIControlStateNormal]; [btn setImageEdgeInsets:UIEdgeInsetsMake(-10, 0, 0, 0)]; //添加标题 UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, _height-18, _width, _height-30)]; titleLabel.backgroundColor = [UIColor clearColor]; titleLabel.text = v.tabBarItem.title; [titleLabel setFont:[UIFont systemFontOfSize:10]]; titleLabel.textAlignment = UITextAlignmentCenter; titleLabel.textColor = [UIColor whiteColor]; [btn addSubview:titleLabel]; [self addChildViewController: v]; [self.itemButtons addObject:btn]; [customTabBarView addSubview:btn]; [titleLabel release]; } [self.view addSubview: customTabBarView]; [customTabBarView addSubview: slideBg]; [self performSelector:@selector(slideTabItemBg:) withObject:[self.itemButtons objectAtIndex:0]]; self.currentSelectedIndex = 0; } //切换滑块位置 - (void)slideTabItemBg:(UIButton *)button { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.20]; [UIView setAnimationDelegate:self]; slideBg.frame = button.frame; [UIView commitAnimations]; CAKeyframeAnimation * animation; animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; animation.duration = 0.50; animation.delegate = self; animation.removedOnCompletion = YES; animation.fillMode = kCAFillModeForwards; NSMutableArray *values = [NSMutableArray array]; [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]]; [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]]; [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.9)]]; [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]]; animation.values = values; [button.layer addAnimation:animation forKey:nil]; } - (void)selectedTabItem: (UIButton *)button { if (self.currentSelectedIndex != button.tag) { [[[viewControllers objectAtIndex: self.currentSelectedIndex] view] removeFromSuperview]; //[[self.viewControllers objectAtIndex:button.tag] popToRootViewControllerAnimated:YES]; UIViewController *viewController = [viewControllers objectAtIndex:button.tag]; [self.view addSubview: viewController.view]; [self.view bringSubviewToFront: self.customTabBarView]; //return; [self performSelector:@selector(slideTabItemBg:) withObject:button]; } self.currentSelectedIndex = button.tag; } @end
方法二:http://www.cocoachina.com/bbs/read.php?tid-62061-page-1.html
方法三:http://hi.baidu.com/yunhuaikong/blog/item/b0642bcbfc5ae49fc817684c.html
自定义Badge:https://github.com/boctor/idev-recipes/tree/master/CustomTabBarNotification
一些自定义控件:https://github.com/boctor/idev-recipes/tree/master/CustomTabBarNotification