IOS开发。UITabBarController常用和自定义

我的文章套路还是一样,先上基础,后上常用:


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://upload-images.jianshu.io/upload_images/1436895-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上,喜欢的可以关注留意一下
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容