IOS开发。UITabBarController常用和自定义
2016-05-06 本文已影响14933人
李白不读书
我的文章套路还是一样,先上基础,后上常用:
Tabbar.png
UITabBarController的基本属性:
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建标签控制器
UITabBarController *tab = [[UITabBarController alloc]init];
//2.创建相应的子控制器(viewcontroller)
FirstViewController *firstVC = [FirstViewController new];
firstVC.navigationItem.title = @"通讯录";
firstVC.tabBarItem.title = @"通讯录";
firstVC.tabBarItem.image = [UIImage imageNamed:@"12-eye"];
UINavigationController *firstNC = [[UINavigationController alloc]initWithRootViewController:firstVC];
SecondViewController *secondVC = [SecondViewController new];
secondVC.navigationItem.title = @"朋友圈";
//设置标签名称
secondVC.tabBarItem.title = @"朋友圈";
//可以根据需求设置标签的的图标
secondVC.tabBarItem.image = [UIImage imageNamed:@"21-skull"];
UINavigationController *secondNC = [[UINavigationController alloc]initWithRootViewController:secondVC];
//3.添加到控制器
//特别注意:管理一组的控制器(最多显示五个,多余五个的话,包括第五个全部在更多模块里面,并且可以通过拖拽方式进行顺序编辑);
NSArray *array = @[firstNC,secondNC]
tab.viewControllers = array;```
我们在实际操作过程中还可以根据taBar的属性,标签栏的颜色、风格、文字颜色等等
//设置标签栏文字和图片的颜色
tab.tabBar.tintColor = [UIColor orangeColor];
//设置标签栏的颜色
tab.tabBar.barTintColor = [UIColor blackColor];
//设置标签栏风格(默认高度49)
tab.tabBar.barStyle = UIBarStyleBlack;
//设置初始状态选中的下标
tab.selectedIndex = 3;
以上是基本的一些属性和操作。但是在实际开发中我们使用自定义tabbar还是比较多的,所以补充一下自定义tabbar。
后面会上传代码
####封装自定义UITabBarController,解决代码结构清晰问题
* 1 添加自定义UITabBarController的子控制器。
在initWithNibName里添加,原因:子控制器只需要添加一次,并且
控制器不需要懒加载,视图才需要,在一创建的时候就拥有子控制
器。
写代码最好一个功能一个方法,是代码结构清晰,方便以后维护,
不要所有代码写在一起。
* 2 设置自定义UITabBarController的tabBar上面的按钮内容,由对应子控制器的tabBarItem决定。
* 3 重构初始化自定义UITabBarController的子控制器的代码
![目录结构](http:https://img.haomeiwen.com/i1436895/fe0f36de5644d18f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
####tabBar上按钮图片处理
* 1> 处理tabBar上按钮的选中图片, ios7默认会把tabBar上按钮的选中图片,渲染成蓝色。告诉图片保持最原始的图片,不要渲染。
* 2> 定义当前版本号的全局宏,在ios7才需要保持最原始的图片。
我封装了一个分类:
import "UIImage+LWImage.h"
@implementation UIImage (LWImage)
+(instancetype)imageWithOriginalName:(NSString *)imageName{
UIImage *image = [UIImage imageNamed:imageName];
return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
@end
---
####设置TabBar上按钮选中文字颜色。
* 1> tabBar上的按钮由tabBarItem决定,可以通过tabBarItem设置文字颜色,有相应的set方法,传入一个文字属性字典设置。
• tabBar的label文字的颜色,在iOS7以上默认是黑色,选中是蓝色。
• 我要的效果:label的文字颜色,默认为黑色,选中为红色.
* 2> 只需要设置一次,可以拿到项目中的所有tabBarItem设置,在Initial设置,并不需要每次都拿到一个tabBarItem设置。
---
####调整TabBar上按钮的位置。
* 1> 自定义TabBar,继承TabBar
• 原因:系统自带的不好使,一个控制器对应一个tabBarButton,微博下边有5个按钮,需要弄个自己的tabBar。
* 2> 如何利用系统自带的tabBar上的按钮,就不需要自己创建tabBarButton?
• 解决方式:覆盖tabBar控制器自带的tabBar为自己的tabBar
* 3> 目的:覆盖tabBar控制器自带的tabBar属性为自己的tabBar,让系统把tabBar上的按钮添加到我们的tabBar上,调整系统自带tabBarButton的位
置。
* 4> 好处:利用系统自带的tabBarButton,如果只是把自定义TabBar加上系统的tabBar上,就拿不到系统自带的tabBarButton,去设置他的位置,必必须自己自定义tabBar上的按钮,很麻烦。
• 解决方式:覆盖tabBar控制器自带的tabBar为自己的tabBar
* 5> 原理:tabBar上的按钮是在viewDidAppear的时候拿到self.tabBar 调用addSubViews添加上去的,在viewDidAppear之前把控制器的tabBar换成我们自己的tabBar,就会把tabBar上的按钮添加到自己的tabBar上。
* 6> 如何覆盖系统自带的tabBar?tabBar控制器的tabBar属性,是readly只读的,不能直接赋值。
利用运行时机制发送消息:
导入
import<objc/message.h>, objc_msgSend(self,
@selector(setTabBar:),customTabBar);*参数1:谁发送这个消息(self)。参数2:发送什么消息(名字叫
setTabBar:),参数3:发送消息的参数。调用set方法,需要传一个
参数,给成员属性赋值,这里传自定义的tabBar。
利用KVC:[self setValue:customTabBar forKeyPath:@"tabBar"];
* 7> 重写layoutSubViews布局子控件。
判断是tabBarButton才需要调整位置
添加UIView的分类,快速设置尺寸和位置。
模仿苹果官方做法,苹果官方bounds,frame都是分类声明的,在分
类用@property只会生成方法的声明,不会生成成员属性,和方法
的实现。
好处:自动生成方法的声明,简便开发,不需要自己写方法声明。
注意点:获取frame,改变宽高,不要通过获取bounds,改变宽高,
单独设置bounds一个属性会影响到frame,使frame设置位置不准确
根据tabBar的items属性,计算出tabBarButton的宽度。
• 从第3个按钮开始,需要多添加一个按钮宽度,给中间加号按钮空出位置。
---
####自定义TabBar上添加加号按钮,显示在最中间,懒加载。
* 1> layoutSubviews方法设置子控件尺寸准确,因为这时候父控件的尺寸确定了,才会去布局子控件。
• 注意点:用分类设置center位置的时候,先设置尺寸,要不然没有尺寸,都不知道控件的中心点在哪,无法准确定位。
---
###以上是大概思路,一些注意点和操作说一下
首先自定义的TabBar可以继承自TabBar 也可以继承自UIView,俩种继承的区别在于,第一种继承你可以使用系统TabBar的东西,对于readonly的东西用KVC的方式去设置。最后替换掉系统自己的TabBar。
第二种继承自UIVIew的思路是创建一个UIView覆盖在原来的TabBar上面,这种好处是这个View你可以随意的去设置,不受系统约束。那么我使用的demo是第二种方式。
---
####自定义tabBar,继承UIView,系统自带的UITabBar不好用
* 1> 添加按钮,由控制器决定,几个控制器就几个按钮。
提供方法给外界添加,默认系统自带的 tabBarButton,传入一个tabBarItem模型
* 2> 添加一个控制器,就调用tabBar添加一个按钮,在添加控制器的代码写。
* 3> 计算tabBar内部子控件,搞一个数组存放所有tabBarButton,方便计算他们的尺寸。
每次添加一个tabBarButton,就调用layoutsubViews重新计算尺寸。注意:如果是在viewDIdLoad给一个控件添加子控件,就不会在添加子控件的时候调用layoutsubViews,如果不在viewDIdLoad给一个控件添加子控件会自动调用layoutsubViews。
* 4> 调整tabBarButton文字和图片的尺寸,假设图片占据按钮高度的0.6,宽度和按钮一样
* 1> 定义比例宏 IWTabBarButtonImageRadio 0.6
* 2> 设置按钮的基本属性,文字大小,文字和图片居中3.KVO监听tabBarItem的属性,模型一改,视图就改
完善badgeView,当传入的文字宽度大于背景图片的时候,清空背景图片,设置image,不显示文字。注意:加一个判断按钮只显示文字的时候,需要把背景和Image都清空,不清空image,默认文字会在图片的右边,不是居中显示。修改tabBarItem的属性,就会改变按钮,给自定义tabBarButton添加KVO,监听item的改变。利用KVO,达到只要模型改变,就刷新视图,默认模型改变,是不会刷新视图的,需要我们手动调用。
在对象被销毁的时候,清空观察者。
4.监听按钮的点击,切换控制器
记录当前选中按钮,默认选中第一个,给按钮绑定tag。
---
过俩天上传代码到github上,喜欢的可以关注留意一下