赞
踩
- (void)viewDidLoad {
[super viewDidLoad];
//因为系统的tabBar不能满足尺寸的需求,所以这里我们自定义一个
XFTabBar *tabBar = [[XFTabBar alloc] init];
//如果要让底部的tabBar隐藏,那么就必须将自定义的tabBar尺寸设置为bounds,和系统的一样.
tabBar.frame = self.tabBar.bounds;
//通过一个get方法和一个set方法达到添加底部按钮的操作
tabBar.arrayItem = self.arrayItem;
//设置代理
tabBar.delegate = self;
//将系统的tabBar移除
//只有将自定义的tabBar加在系统的tabBar上面,才能达到隐藏的效果
[self.tabBar addSubview:tabBar];

//tabBarItem本身就是一个模型,这里我们将每个控制器对应的tabBar存入可变数组中
[self.arrayItem addObject:vc.tabBarItem];
#pragma mark - 懒加载
- (NSMutableArray *)arrayItem
{
if (_arrayItem == nil) {
_arrayItem = [NSMutableArray array];
}
return _arrayItem;
}
//通过一个get方法和一个set方法达到添加底部按钮的操作
tabBar.arrayItem = self.arrayItem;
#pragma mark - 在里面创建tabBar下面的按钮
//重写arrayItemset方法-->在里面创建UIButton
- (void)setArrayItem:(NSArray *)arrayItem
{
_arrayItem = arrayItem;
for (int i = 0; i < arrayItem.count; i++) {
//创建按钮
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.tag = i;
//根据传入的模型角标取出模型
UITabBarItem *item = arrayItem[i];
//设置按钮的背景图片
[btn setBackgroundImage:item.image forState:UIControlStateNormal];
[btn setBackgroundImage:item.selectedImage forState:UIControlStateSelected];
//将创建出来的按钮添加到自定义的tabBar中
[self addSubview:btn];
//监听按钮的点击
//UIControlEventTouchDown:由于是事件的点击,所以用这个
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];
//让程序已加载完,显示页面的时候,默认是在第0个按钮
if (i == 0) {
[self btnClick:btn];
}
}
}

#pragma mark - 布局子控件
- (void)layoutSubviews
{
[super layoutSubviews];
//重tabBar中取出每个子控件,告诉编译器是整数
int count = (int)self.subviews.count;
//计算每个子控件的位置
CGFloat x = 0;
CGFloat y = 0;
//每个按钮的宽度
CGFloat btnW = self.bounds.size.width / count;
//每个按钮的高度
CGFloat btnH = self.bounds.size.height;
for (int i = 0; i < count; i++) {
//是第几个按钮,就计算出对应的宽度
x = i * btnW;
//根据角标一次取出每个按钮
UIButton *btn = self.subviews[i];
btn.frame = CGRectMake(x, y, btnW, btnH);
}
}

#pragma mark - 实现监听方法
- (void)btnClick:(UIButton *)btn
{
//让上一个按钮取消选中状态
self.preSelecBtn.selected = NO;
//让当前的按钮选中
btn.selected = YES;
//让当前点击的按钮成为上一个选中的按钮
self.preSelecBtn = btn;
//调用代理
//判断代理是否实现对应的代理方法
if ([self.delegate respondsToSelector:@selector(tabBar:selectBtnIndex:)]) {
//调用代理方法
[self.delegate tabBar:self selectBtnIndex:btn.tag];
}
}

/*由于我们希望XFTabBarController控制器能知道用户点击的是哪个按钮,然后让控制器切换到对应的界面
问题:但是怎么知道用户点击的是哪个按钮呢?
实现方法:代理
具体做法:在自定义的XFTabBar中设置代理属性,并且设置协议方法,通过协议中的方法将用户点击的是哪个按钮通过方法传递给控制器,然后控制器再切换到相应的界面
代理人:XFTabBarController,让它实现协议的相应的方法,然后就能知道用户点击的是哪个按钮,做出相应的界面切换
*/
@class XFTabBar;
@protocol XFTabBarDelegate<NSObject>
//协议的方法;selectBtnIndex传入相应的点击的角标
- (void)tabBar:(XFTabBar *)tabBar selectBtnIndex:(NSInteger)index;
@end
@interface XFTabBar : UIView
//创建数组
@property (nonatomic, strong) NSArray *arrayItem;
//设置代理
@property (nonatomic, weak) id<XFTabBarDelegate>delegate;
#pragma mark - 实现代理方法
- (void)tabBar:(XFTabBar *)tabBar selectBtnIndex:(NSInteger)index
{
//设置寻找第几个控制器
self.selectedIndex = index;
}
//如果要让底部的tabBar隐藏,那么就必须将自定义的tabBar尺寸设置为bounds,和系统的一样.
tabBar.frame = self.tabBar.bounds;
[self.tabBar addSubview:tabBar];
#pragma mark - 当点击cell进入下一个页面的时候隐藏下面的tabBar
//在view即将显示的时候的方法里写
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//遍历系统tabBar的所有子控件
for (UIView *view in self.tabBar.subviews) {
if (![view isKindOfClass:[XFTabBar class]]) {
//移除不属于XFTabBar的子控件
[view removeFromSuperview];
}
}
}
viewController.hidesBottomBarWhenPushed = YES;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。