第一种:利用系统自带的tabbarItem加一个自定义按钮:
#import "SZMTabBarController.h" #import "SZMTabBar.h" #import "SZMHomeViewCtrl.h" #import "SZMNavigationController.h" #import "SZMDiscoerViewCtrl.h" @interface SZMTabBarController ()<SZMTabBarDelegate> @end @implementation SZMTabBarController - (void)viewDidLoad { [super viewDidLoad]; //初始化一个自己的tabbar SZMTabBar *tabBar = [[SZMTabBar alloc]init]; tabBar.delegate = self; //通过KVC去设置只读的属性 [self setValue:tabBar forKey:@"tabBar"]; //添加四个控制器 //首页 SZMHomeViewCtrl *homeCtrl = [[SZMHomeViewCtrl alloc]init]; [self addChildVc:homeCtrl title:@"首页" imageName:@"tabbar_home" selImgName:@"tabbar_home_selected"]; UITableViewController *messageCtrl = [[UITableViewController alloc]init]; [self addChildVc:messageCtrl title:@"消息" imageName:@"tabbar_message_center" selImgName:@"tabbar_message_center_selected"]; SZMDiscoerViewCtrl *discoveryCtrl = [[SZMDiscoerViewCtrl alloc]init]; [self addChildVc:discoveryCtrl title:@"发现" imageName:@"tabbar_discover" selImgName:@"tabbar_discover_selected"]; UITableViewController *profileCtrl = [[UITableViewController alloc]init]; [self addChildVc:profileCtrl title:@"我" imageName:@"tabbar_profile" selImgName:@"tabbar_profile_selected"]; } //设置tabbar的一些属性 - (void)addChildVc:(UIViewController *)Controller title:(NSString *)title imageName:(NSString *)imgName selImgName:(NSString *)selImgName{ Controller.title = title; Controller.tabBarItem.image = [UIImage imageNamed:imgName]; Controller.tabBarItem.selectedImage = [UIImage imageNamed:selImgName]; self.tabBar.tintColor = [UIColor orangeColor]; SZMNavigationController *navCtrl = [[SZMNavigationController alloc]initWithRootViewController:Controller]; [self addChildViewController:navCtrl]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void)TabBar:(SZMTabBar *)TabBar plusBtnDidClick:(UIButton *)btn{ NSLog(@"1"); } @end
#import <UIKit/UIKit.h> @class SZMTabBar; #warning 我们自定义的控件,如果是继承于系统的控件的话,而且系统的控件有代理,我们的协议一定要继承父类的协议 @protocol SZMTabBarDelegate <NSObject,UITabBarDelegate> - (void)TabBar:(SZMTabBar *)TabBar plusBtnDidClick:(UIButton *)btn; @end @interface SZMTabBar : UITabBar @property (nonatomic,weak) id<SZMTabBarDelegate> delegate; @end
#import "SZMTabBar.h" @interface SZMTabBar () @property (nonatomic,weak) UIButton *plusBtn; @end @implementation SZMTabBar @dynamic delegate; - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { //添加加号按钮 UIButton *plusBtn = [[UIButton alloc]init]; //给button设置不同状态下背景图片 [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; [self addSubview:plusBtn]; self.plusBtn = plusBtn; plusBtn.size = plusBtn.currentBackgroundImage.size; //给按钮添加点击事件 [plusBtn addTarget:self action:@selector(plusBtnClick:) forControlEvents:UIControlEventTouchUpInside]; } return self; } - (void)plusBtnClick:(UIButton *)btn{ //代理方法的实现 if ([self.delegate respondsToSelector:@selector(TabBar:plusBtnDidClick:)]) { [self.delegate TabBar:self plusBtnDidClick:btn]; } } -(void)layoutSubviews{ [super layoutSubviews]; //调整加号按钮的位置 self.plusBtn.centerX = self.width *0.5; self.plusBtn.centerY = self.height *0.5; //调整uitabbarbutton的大小和位置 CGFloat tabBarBtnW = self.width *0.2; NSInteger index = 0; for (UIView *view in self.subviews) { if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) { view.width = tabBarBtnW; view.x = index * tabBarBtnW; if (index == 1) { index++; } index++; } } } @end
第二种:自己完全自定义底部tabbar:
#import "SZMMainTabBarController.h" #import "SZMBottomBarView.h" @interface SZMMainTabBarController ()<SZMBottomBarViewDelegate> @end @implementation SZMMainTabBarController - (void)viewDidLoad { [super viewDidLoad]; //加载子控制器 [self loadSubControllers]; //加载底部自定义view [self loadBottomView]; } //加载底部自定义的view - (void)loadBottomView{ //创建底部的自定义的tabbarview SZMBottomBarView *BottomView = [[SZMBottomBarView alloc]init]; BottomView.delegate = self; BottomView.backgroundColor = [UIColor redColor]; BottomView.frame = self.tabBar.bounds; [self.tabBar addSubview:BottomView]; //给自定义view里添加按钮 for (int i = 0; i < self.viewControllers.count; i++) { NSString *NormalImgName = [NSString stringWithFormat:@"TabBar%d",i+1]; NSString *SelectedImgName = [NSString stringWithFormat:@"TabBar%dSel",i+1]; [BottomView addBarButtonWithNormalImgName:NormalImgName andSelectedImgName:SelectedImgName]; } } - (void)SZMBottomBarView:(SZMBottomBarView *)SZMBottomBarViewWith didSclectedBtnIndex:(int)index{ self.selectedIndex = index; } //加载五个子控制器到tabbar控制器 - (void)loadSubControllers{ //购彩大厅 UINavigationController *navHall = [self navigationControllerWithStoryboardName:@"Hall"]; //竞技场 UINavigationController *navArena = [self navigationControllerWithStoryboardName:@"Arena"]; //发现 UINavigationController *navDiscovery = [self navigationControllerWithStoryboardName:@"Discovery"]; //开奖信息 UINavigationController *navHistory = [self navigationControllerWithStoryboardName:@"History"]; //我的彩票 UINavigationController *navMyLottery = [self navigationControllerWithStoryboardName:@"MyLottery"]; self.viewControllers = @[navHall,navArena,navDiscovery,navHistory,navMyLottery]; } //加载对应的初始化控制器的方法 - (UINavigationController *)navigationControllerWithStoryboardName:(NSString *)storyboard{ //1.创建stroyboard对象 UIStoryboard *S1 = [UIStoryboard storyboardWithName:storyboard bundle:nil]; //2.实例化这个stroyboard中的初始化控制器 UINavigationController *nav = [S1 instantiateInitialViewController]; return nav; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
#import <UIKit/UIKit.h> @class SZMBottomBarView; @protocol SZMBottomBarViewDelegate <NSObject> @optional - (void)SZMBottomBarView:(SZMBottomBarView *)SZMBottomBarViewWith didSclectedBtnIndex:(int)index; @end @interface SZMBottomBarView : UIView - (void)addBarButtonWithNormalImgName:(NSString *)NormalImgName andSelectedImgName:(NSString *)SelectedImgName; @property (nonatomic,weak) id<SZMBottomBarViewDelegate> delegate; @end
#import "SZMBottomBarView.h" #import "SZMBottomBarBtn.h" @interface SZMBottomBarView () @property (nonatomic,weak) UIButton *selectedBtn; @end @implementation SZMBottomBarView - (void)addBarButtonWithNormalImgName:(NSString *)NormalImgName andSelectedImgName:(NSString *)SelectedImgName { //创建一个uibutton SZMBottomBarBtn *btn = [[SZMBottomBarBtn alloc]init]; //设置uibutton的背影图片 UIImage *NorImg = [UIImage imageNamed:NormalImgName]; UIImage *SelImg = [UIImage imageNamed:SelectedImgName]; [btn setBackgroundImage:NorImg forState:UIControlStateNormal]; [btn setBackgroundImage:SelImg forState:UIControlStateSelected]; //把uibutton添加到自己身上 [self addSubview:btn]; //给每个底部的按钮添加点击事件 [btn addTarget:self action:@selector(bottomBarButtonTouchDown:) forControlEvents:UIControlEventTouchDown]; } //底部按钮点击事件的方法(占击哪个把哪个设置为选中状态) - (void)bottomBarButtonTouchDown:(UIButton *)sennder { //设置被点击按钮的状态 self.selectedBtn.selected = NO; sennder.selected = YES; self.selectedBtn = sennder; //切换控制器 if ([self.delegate respondsToSelector:@selector(SZMBottomBarView:didSclectedBtnIndex:)]) { [self.delegate SZMBottomBarView:self didSclectedBtnIndex:(int)sennder.tag]; } } - (void)layoutSubviews { [super layoutSubviews]; CGFloat y = 0; CGFloat w = self.bounds.size.width / self.subviews.count; CGFloat h = self.bounds.size.height; for (int i = 0; i < self.subviews.count; ++i) { CGFloat X = w *i; UIButton *button = (UIButton *)self.subviews[i]; button.tag = i; button.frame = CGRectMake(X, y, w, h); //设置进入页面后第一个按钮为选中状态 if (i == 0) { self.selectedBtn.selected = NO; button.selected = YES; self.selectedBtn = button; } } } @end
#import <UIKit/UIKit.h> @interface SZMBottomBarBtn : UIButton @end
#import "SZMBottomBarBtn.h" @implementation SZMBottomBarBtn - (void)setHighlighted:(BOOL)highlighted{ } @end