一、环境配置,和项目层次搭建
二、自定义TabBar
- 项目中TabBar中的导航按钮美工给的图片太大,图片中包含了图片和文字。最主要的是TabBar上面的按钮图片尺寸是有规定的,当高度大于44的时候,就不会显示了
解决办法:自定义TabBar,继承自UIView,给UIView设置相应个数的按钮,自定义控件需要
1、自定义控件类 -- 自身有存放模型数据的集合,在数据的setter方法中定义子控件,给子控件设置相应的属性
2、模型类--这里的模型类借用了系统的UITabBarItem,因为系统设置TabBar样式就是用的UITabBarItem
--下面代码是给控制器的数据集合装配
-- 下面代码是将模型数据传递给自定义控件
-- 自定义控件中的属性,以及代理,代理的作用点击了TabBar上的按钮后,通知TabBar控制器跳转相应的控制器。
TabBar控制器的self.selectedIndex = index;可以控制跳转到具体的控制器,所以在为自定义TabBar布局的时候,将内部的按钮设置了tag,相应的tag对应自己的控制器
-- 自定义控件类内部实现代码
1 @interface ChaosTabBar () 2 /** 记录选中的按钮 */ 3 @property(nonatomic,weak) UIButton *btn; 4 @end 5 6 @implementation ChaosTabBar 7 8 - (void)setItems:(NSArray *)items 9 { 10 // 遍历数据集合,添加按钮 11 _items = items; 12 for (UITabBarItem *barItem in items) { 13 UIButton *button = [ChaosTabBarButton buttonWithType:UIButtonTypeCustom]; 14 15 // 设置背景图片啊,不是设置iamge 16 [button setBackgroundImage:barItem.image forState:UIControlStateNormal]; 17 [button setBackgroundImage:barItem.selectedImage forState:UIControlStateSelected]; 18 // 给按钮添加点击事件 19 [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown]; 20 // 绑定 tag 切换控制器的时候使用 21 button.tag = self.subviews.count; 22 [self addSubview:button]; 23 24 25 // 默认选中第一个 26 if (self.subviews.count == 1) { 27 [self btnClick:button]; 28 } 29 } 30 } 31 32 // 点击按钮执行的方法 33 - (void)btnClick:(UIButton *)btn 34 { 35 // 取消上次选中的按钮 36 _btn.selected = NO; 37 btn.selected = YES; 38 39 // 记录被选中的按钮 40 _btn = btn; 41 42 // 通知代理 TabBarVC 跳转控制器 43 if ([_delegate respondsToSelector:@selector(tabBar:didClickBtn:)]) { 44 [_delegate tabBar:self didClickBtn:btn.tag]; 45 } 46 } 47 48 // 排列子控件 49 - (void)layoutSubviews 50 { 51 [super layoutSubviews]; 52 53 NSInteger count = self.subviews.count; 54 55 CGFloat x = 0; 56 CGFloat y = 0; 57 CGFloat w = [UIScreen mainScreen].bounds.size.width / count; 58 CGFloat h = self.bounds.size.height; 59 60 for (int i = 0; i < count; i++) { 61 UIButton *btn = self.subviews[i]; 62 63 x = i * w; 64 btn.frame = CGRectMake(x, y, w, h); 65 } 66 } 67 68 @end
三、自定义导航控制器,设置所有继承自自定义导航控制器类的title的文字颜色