使用tarBar大多数情况在我们都是默认的tarBarButton尺寸和位置但是如果我们想,希望像新浪微博那样的tarBar,就需要自定义了。
1、本质上其实就是通过我们的主控制器中以KVC的方式重新构造我们新的tarBar,(http://www.cnblogs.com/daomul/p/4581717.html)
//更换系统的tabBar(KVC的形式,即使是只读的也可以修改)
XBTabBar *tarBar = [[XBTabBar alloc]init];
tarBar.delegate = self;//这个代理主要是针对点击事件的
[self setValue:tarBar forKey:@"tabBar"];
2、重新构造tarBar之后,在initWithFrame里面添加一个按钮到我们的tarBar中,由于重新添加子控件,所以会自动调用layoutSubviews方法。在layoutSubviews方法中我们重新排列对应的子控件的位置和尺寸(这里需要注意的是子控件需要判断是UITarBarButton,其中还有两个其他类型的子控件)
3、对应的按钮的点击事件,在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器,所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出。顺序是:plusClick ——>tabBarDidClickButton
#pragma mark -- XBTarBarDelegate代理方法(这里是对应的主控制器被调用的方法)
-(void)tabBarDidClickButton:(XBTabBar *)tarBar
{
UIViewController *VC = [[UIViewController alloc]init];
VC.view.backgroundColor = [UIColor redColor];
[self presentViewController:VC animated:YES completion:nil];
}
头文件:
1 // 2 // XBTabBar.h 3 // XibaTest 4 // 5 // Created by bos on 15-6-20. 6 // Copyright (c) 2015年 axiba. All rights reserved. 7 // 8 9 #import <UIKit/UIKit.h> 10 11 @class XBTabBar; 12 13 //1、因为XBtabBar继承自UITarBar,所以如果想建立自己的代理,也需要实现UITaBar的代理协议UITabBarDelegate 14 @protocol XBTabBarDelegate <UITabBarDelegate> 15 16 //2、设置可选的代理方法 17 @optional 18 -(void)tabBarDidClickButton:(XBTabBar *)tarBar; 19 20 @end 21 22 @interface XBTabBar : UITabBar 23 24 //3、将协议作为一个属性放出来(代理弱指针) 25 @property (nonatomic,weak) id<XBTabBarDelegate> delegate; 26 27 @end
代码文件:
1 // 2 // XBTabBar.m 3 // XibaTest 4 // 5 // Created by bos on 15-6-20. 6 // Copyright (c) 2015年 axiba. All rights reserved. 7 // 8 9 10 #import "XBTabBar.h" 11 12 @interface XBTabBar() 13 @property (nonatomic,weak) UIButton *composeBtn; 14 @end 15 16 @implementation XBTabBar 17 18 -(instancetype)initWithFrame:(CGRect)frame 19 { 20 self = [super initWithFrame:frame]; 21 if (self) { 22 23 //添加一个按钮到tabBar中 24 UIButton *composeBtn = [[UIButton alloc]init]; 25 [composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; 26 [composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; 27 28 [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; 29 [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; 30 composeBtn.size = composeBtn.currentBackgroundImage.size; 31 [composeBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside]; 32 [self addSubview: composeBtn]; 33 34 self.composeBtn = composeBtn; 35 } 36 return self; 37 } 38 39 -(void)plusClick 40 { 41 //在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器 42 //所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出 43 XBLog(@"11"); 44 45 //先判断是否存在对应的代理方法,然后执行代理的方法 46 if ([self.delegate respondsToSelector:@selector(tabBarDidClickButton:)]) 47 { 48 [self.delegate tabBarDidClickButton:self]; 49 } 50 } 51 52 -(void)layoutSubviews 53 { 54 [super layoutSubviews]; 55 56 //1、新增加的中间的按钮 57 self.composeBtn.centerX = self.width *0.5; 58 self.composeBtn.centerY = self.height *0.5; 59 60 //2、设置其他tabbarButton的尺寸和位置 61 62 CGFloat tabBarButtonW = self.width / 5; 63 CGFloat tabBarButtonIndex = 0; 64 for (UIView *childV in self.subviews) 65 { 66 //先判断是不是UITabBarButton的子控件(打印tarBar的子控件会发现还有其他两个子控件) 67 Class class = NSClassFromString(@"UITabBarButton"); 68 if ([childV isKindOfClass:class]) { 69 70 //重新设置TabBarButton子控件的宽度和X值(X值根据索引来定位值) 71 childV.width = tabBarButtonW; 72 childV.x = tabBarButtonIndex * tabBarButtonW; 73 74 //增加索引,如果是第三个位置则跳过空一个位置给上面的Button 75 tabBarButtonIndex++; 76 if (tabBarButtonIndex == 2) { 77 tabBarButtonIndex++; 78 } 79 } 80 } 81 } 82 83 @end