IOS開發(fā)。UITabBarController常用和自定義

我的文章套路還是一樣,先上基礎(chǔ)摩泪,后上常用:


Tabbar.png

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)注留意一下
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杠茬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弛随,更是在濱河造成了極大的恐慌瓢喉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舀透,死亡現(xiàn)場離奇詭異栓票,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愕够,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門逗载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人链烈,你說我怎么就攤上這事厉斟。” “怎么了强衡?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵擦秽,是天一觀的道長。 經(jīng)常有香客問我漩勤,道長感挥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任越败,我火速辦了婚禮触幼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘究飞。我一直安慰自己置谦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布亿傅。 她就那樣靜靜地躺著媒峡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葵擎。 梳的紋絲不亂的頭發(fā)上谅阿,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼签餐。 笑死寓涨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氯檐。 我是一名探鬼主播缅茉,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼男摧!你這毒婦竟也來了蔬墩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤耗拓,失蹤者是張志新(化名)和其女友劉穎拇颅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乔询,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樟插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竿刁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黄锤。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖食拜,靈堂內(nèi)的尸體忽然破棺而出鸵熟,到底是詐尸還是另有隱情,我是刑警寧澤负甸,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布流强,位于F島的核電站,受9級特大地震影響呻待,放射性物質(zhì)發(fā)生泄漏打月。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蚕捉、第九天 我趴在偏房一處隱蔽的房頂上張望奏篙。 院中可真熱鬧,春花似錦迫淹、人聲如沸秘通。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽充易。三九已至,卻和暖如春荸型,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工瑞妇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稿静,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓辕狰,卻偏偏與公主長得像改备,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔓倍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容