我的文章套路還是一樣,先上基礎(chǔ)摩泪,后上常用:
UITabBarController的基本屬性:
- (void)viewDidLoad {
[super viewDidLoad];
//1.創(chuàng)建標(biāo)簽控制器
UITabBarController *tab = [[UITabBarController alloc]init];
//2.創(chuàng)建相應(yīng)的子控制器(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 = @"朋友圈";
//設(shè)置標(biāo)簽名稱
secondVC.tabBarItem.title = @"朋友圈";
//可以根據(jù)需求設(shè)置標(biāo)簽的的圖標(biāo)
secondVC.tabBarItem.image = [UIImage imageNamed:@"21-skull"];
UINavigationController *secondNC = [[UINavigationController alloc]initWithRootViewController:secondVC];
//3.添加到控制器
//特別注意:管理一組的控制器(最多顯示五個,多余五個的話,包括第五個全部在更多模塊里面,并且可以通過拖拽方式進(jìn)行順序編輯);
NSArray *array = @[firstNC,secondNC]
tab.viewControllers = array;```
我們在實(shí)際操作過程中還可以根據(jù)taBar的屬性,標(biāo)簽欄的顏色劫谅、風(fēng)格见坑、文字顏色等等
//設(shè)置標(biāo)簽欄文字和圖片的顏色
tab.tabBar.tintColor = [UIColor orangeColor];
//設(shè)置標(biāo)簽欄的顏色
tab.tabBar.barTintColor = [UIColor blackColor];
//設(shè)置標(biāo)簽欄風(fēng)格(默認(rèn)高度49)
tab.tabBar.barStyle = UIBarStyleBlack;
//設(shè)置初始狀態(tài)選中的下標(biāo)
tab.selectedIndex = 3;
以上是基本的一些屬性和操作。但是在實(shí)際開發(fā)中我們使用自定義tabbar還是比較多的捏检,所以補(bǔ)充一下自定義tabbar荞驴。
后面會上傳代碼
####封裝自定義UITabBarController,解決代碼結(jié)構(gòu)清晰問題
* 1 添加自定義UITabBarController的子控制器。
在initWithNibName里添加,原因:子控制器只需要添加一次,并且
控制器不需要懶加載,視圖才需要,在一創(chuàng)建的時候就擁有子控制
器贯城。
寫代碼最好一個功能一個方法,是代碼結(jié)構(gòu)清晰,方便以后維護(hù),
不要所有代碼寫在一起熊楼。
* 2 設(shè)置自定義UITabBarController的tabBar上面的按鈕內(nèi)容,由對應(yīng)子控制器的tabBarItem決定。
* 3 重構(gòu)初始化自定義UITabBarController的子控制器的代碼
![目錄結(jié)構(gòu)](http://upload-images.jianshu.io/upload_images/1436895-fe0f36de5644d18f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
####tabBar上按鈕圖片處理
* 1> 處理tabBar上按鈕的選中圖片, ios7默認(rèn)會把tabBar上按鈕的選中圖片,渲染成藍(lán)色冤狡。告訴圖片保持最原始的圖片,不要渲染孙蒙。
* 2> 定義當(dāng)前版本號的全局宏,在ios7才需要保持最原始的圖片项棠。
我封裝了一個分類:
import "UIImage+LWImage.h"
@implementation UIImage (LWImage)
+(instancetype)imageWithOriginalName:(NSString *)imageName{
UIImage *image = [UIImage imageNamed:imageName];
return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
@end
---
####設(shè)置TabBar上按鈕選中文字顏色。
* 1> tabBar上的按鈕由tabBarItem決定,可以通過tabBarItem設(shè)置文字顏色,有相應(yīng)的set方法,傳入一個文字屬性字典設(shè)置挎峦。
? tabBar的label文字的顏色,在iOS7以上默認(rèn)是黑色,選中是藍(lán)色香追。
? 我要的效果:label的文字顏色,默認(rèn)為黑色,選中為紅色.
* 2> 只需要設(shè)置一次,可以拿到項(xiàng)目中的所有tabBarItem設(shè)置,在Initial設(shè)置,并不需要每次都拿到一個tabBarItem設(shè)置。
---
####調(diào)整TabBar上按鈕的位置坦胶。
* 1> 自定義TabBar,繼承TabBar
? 原因:系統(tǒng)自帶的不好使,一個控制器對應(yīng)一個tabBarButton,微博下邊有5個按鈕,需要弄個自己的tabBar透典。
* 2> 如何利用系統(tǒng)自帶的tabBar上的按鈕,就不需要自己創(chuàng)建tabBarButton?
? 解決方式:覆蓋tabBar控制器自帶的tabBar為自己的tabBar
* 3> 目的:覆蓋tabBar控制器自帶的tabBar屬性為自己的tabBar,讓系統(tǒng)把tabBar上的按鈕添加到我們的tabBar上,調(diào)整系統(tǒng)自帶tabBarButton的位
置。
* 4> 好處:利用系統(tǒng)自帶的tabBarButton,如果只是把自定義TabBar加上系統(tǒng)的tabBar上,就拿不到系統(tǒng)自帶的tabBarButton,去設(shè)置他的位置,必必須自己自定義tabBar上的按鈕,很麻煩顿苇。
? 解決方式:覆蓋tabBar控制器自帶的tabBar為自己的tabBar
* 5> 原理:tabBar上的按鈕是在viewDidAppear的時候拿到self.tabBar 調(diào)用addSubViews添加上去的,在viewDidAppear之前把控制器的tabBar換成我們自己的tabBar,就會把tabBar上的按鈕添加到自己的tabBar上峭咒。
* 6> 如何覆蓋系統(tǒng)自帶的tabBar?tabBar控制器的tabBar屬性,是readly只讀的,不能直接賦值。
利用運(yùn)行時機(jī)制發(fā)送消息:
導(dǎo)入
import<objc/message.h>, objc_msgSend(self,
@selector(setTabBar:),customTabBar);*參數(shù)1:誰發(fā)送這個消息(self)纪岁。參數(shù)2:發(fā)送什么消息(名字叫
setTabBar:),參數(shù)3:發(fā)送消息的參數(shù)凑队。調(diào)用set方法,需要傳一個
參數(shù),給成員屬性賦值,這里傳自定義的tabBar。
利用KVC:[self setValue:customTabBar forKeyPath:@"tabBar"];
* 7> 重寫layoutSubViews布局子控件幔翰。
判斷是tabBarButton才需要調(diào)整位置
添加UIView的分類,快速設(shè)置尺寸和位置漩氨。
模仿蘋果官方做法,蘋果官方bounds,frame都是分類聲明的,在分
類用@property只會生成方法的聲明,不會生成成員屬性,和方法
的實(shí)現(xiàn)。
好處:自動生成方法的聲明,簡便開發(fā),不需要自己寫方法聲明遗增。
注意點(diǎn):獲取frame,改變寬高,不要通過獲取bounds,改變寬高,
單獨(dú)設(shè)置bounds一個屬性會影響到frame,使frame設(shè)置位置不準(zhǔn)確
根據(jù)tabBar的items屬性,計算出tabBarButton的寬度叫惊。
? 從第3個按鈕開始,需要多添加一個按鈕寬度,給中間加號按鈕空出位置。
---
####自定義TabBar上添加加號按鈕,顯示在最中間,懶加載做修。
* 1> layoutSubviews方法設(shè)置子控件尺寸準(zhǔn)確,因?yàn)檫@時候父控件的尺寸確定了,才會去布局子控件霍狰。
? 注意點(diǎn):用分類設(shè)置center位置的時候,先設(shè)置尺寸,要不然沒有尺寸,都不知道控件的中心點(diǎn)在哪,無法準(zhǔn)確定位。
---
###以上是大概思路饰及,一些注意點(diǎn)和操作說一下
首先自定義的TabBar可以繼承自TabBar 也可以繼承自UIView蔗坯,倆種繼承的區(qū)別在于,第一種繼承你可以使用系統(tǒng)TabBar的東西旋炒,對于readonly的東西用KVC的方式去設(shè)置步悠。最后替換掉系統(tǒng)自己的TabBar签杈。
第二種繼承自UIVIew的思路是創(chuàng)建一個UIView覆蓋在原來的TabBar上面瘫镇,這種好處是這個View你可以隨意的去設(shè)置,不受系統(tǒng)約束答姥。那么我使用的demo是第二種方式铣除。
---
####自定義tabBar,繼承UIView,系統(tǒng)自帶的UITabBar不好用
* 1> 添加按鈕,由控制器決定,幾個控制器就幾個按鈕。
提供方法給外界添加,默認(rèn)系統(tǒng)自帶的 tabBarButton,傳入一個tabBarItem模型
* 2> 添加一個控制器,就調(diào)用tabBar添加一個按鈕,在添加控制器的代碼寫鹦付。
* 3> 計算tabBar內(nèi)部子控件,搞一個數(shù)組存放所有tabBarButton,方便計算他們的尺寸尚粘。
每次添加一個tabBarButton,就調(diào)用layoutsubViews重新計算尺寸。注意:如果是在viewDIdLoad給一個控件添加子控件,就不會在添加子控件的時候調(diào)用layoutsubViews,如果不在viewDIdLoad給一個控件添加子控件會自動調(diào)用layoutsubViews敲长。
* 4> 調(diào)整tabBarButton文字和圖片的尺寸,假設(shè)圖片占據(jù)按鈕高度的0.6,寬度和按鈕一樣
* 1> 定義比例宏 IWTabBarButtonImageRadio 0.6
* 2> 設(shè)置按鈕的基本屬性,文字大小,文字和圖片居中3.KVO監(jiān)聽tabBarItem的屬性,模型一改,視圖就改
完善badgeView,當(dāng)傳入的文字寬度大于背景圖片的時候,清空背景圖片,設(shè)置image,不顯示文字郎嫁。注意:加一個判斷按鈕只顯示文字的時候,需要把背景和Image都清空,不清空image,默認(rèn)文字會在圖片的右邊,不是居中顯示秉继。修改tabBarItem的屬性,就會改變按鈕,給自定義tabBarButton添加KVO,監(jiān)聽item的改變。利用KVO,達(dá)到只要模型改變,就刷新視圖,默認(rèn)模型改變,是不會刷新視圖的,需要我們手動調(diào)用泽铛。
在對象被銷毀的時候,清空觀察者尚辑。
4.監(jiān)聽按鈕的點(diǎn)擊,切換控制器
記錄當(dāng)前選中按鈕,默認(rèn)選中第一個,給按鈕綁定tag。
---
過倆天上傳代碼到github上盔腔,喜歡的可以關(guān)注留意一下