UITabBarController 詳解

一、 UITabBarController的原理


1.1 基本概念

父控制器:通過標(biāo)簽控制器管理多個(gè)子控制器膨桥,標(biāo)簽控制器就稱為父控制器

子控制器:添加到標(biāo)簽控制器里的控制器都做為標(biāo)簽控制器的子控制器

標(biāo)簽欄:也叫選項(xiàng)卡欄容握,方便用戶切換到對應(yīng)的界面弹谁,當(dāng)往標(biāo)簽控制器里添加子控制器弹澎,標(biāo)簽欄就會(huì)有序的自動(dòng)生成對應(yīng)的標(biāo)簽

標(biāo)簽欄按鈕:也叫標(biāo)簽设联,UITabBarButton捌年,這個(gè)類只有apple內(nèi)部開發(fā)人員才能使用

1.2 UITabBarController原理

  1. 當(dāng)UITabBarController做為Window的根控制器時(shí)崖瞭,程序一啟動(dòng),UITabBarController就會(huì)一次性初始化所有子控制器胚吁,但是默認(rèn)只加載第一個(gè)控制器視圖牙躺,其他視圖控制器只初始化愁憔,但默認(rèn)不會(huì)加載腕扶,只有在需要顯示的時(shí)候才調(diào)用loadView方法加載。特殊情況:在AppDelegate中設(shè)置其他的子控制器視圖的背景顏色吨掌,就會(huì)提前加載該控制器視圖半抱,但不顯示該視圖。

  2. 每一個(gè)控制器視圖只加載一次膜宋,就會(huì)一直存在內(nèi)存中窿侈,當(dāng)切換子控制器時(shí)直接顯示,不顯示在屏幕上的子控制器不會(huì)被銷毀秋茫。當(dāng)遇到內(nèi)存警告時(shí)史简,會(huì)釋放掉沒有加載的子控制器。

  3. 每個(gè)視圖控制器都有一個(gè)tabBarController屬性肛著,通過它可以訪問所在的UITabBarController圆兵,而且對于UITabBarController的直接子視圖,其tabBarController屬性相當(dāng)于它的父視圖parentViewController枢贿。

  4. 每個(gè)視圖控制器都有一個(gè)tabBarItem屬性殉农,通過它控制視圖在UITabBarController的tabBar中的顯示信息

  5. tabBarItem的image屬性必須是png格式(建議大小32*32),并且打開alpha通道否則無法正常顯示局荚。

當(dāng)往UITabBarController添加子控制器超凳,標(biāo)簽欄就會(huì)有序的自動(dòng)生成對應(yīng)的UITabBarButton對象愈污,有多少個(gè)子控制器,標(biāo)簽欄就有多少個(gè)UITabBarButton對象轮傍, 但是子控制器的數(shù)量超過5個(gè)的時(shí)候暂雹,標(biāo)簽欄上的第五個(gè)UITabBarButton對象就會(huì)顯示成”More”類型的按鈕

二金麸、UITabBarController的知識點(diǎn)


2.1 關(guān)于UITabBarController

  1. UITabBarController沒有根控制器的概念擎析。在添加了相同的子控制器,不會(huì)增加tabitem的數(shù)量挥下。子控器可以是UIViewController揍魂、UINavigationController、UITableViewController或者其他的視圖控制器

  2. UITabBarButton在UITabBar中的位置是均分的棚瘟,UITabBar的高度為49现斋,UITabBarButton?面顯?什么內(nèi)容,由對應(yīng)子控制器的tabBarItem屬性來決定

  3. UITabBarController一般作為應(yīng)用程序的rootViewController偎蘸,但是它不能作為UINavigationController的根控制器

  4. UITabBarController默認(rèn)只支持豎屏庄蹋,當(dāng)設(shè)備方向放生變化時(shí)候,它會(huì)查詢viewControllers屬性中包含的所有ViewController迷雪,僅當(dāng)所有的viewController都支持該方向時(shí)限书,UITabBarController才會(huì)發(fā)生旋轉(zhuǎn),否則默認(rèn)的豎向

2.2 關(guān)于UITabBar

2.2.1 簡介

UITabBar繼承于UIView章咧,方便用戶切換到對應(yīng)的界面倦西,當(dāng)往標(biāo)簽控制器里添加子控制器,標(biāo)簽欄就會(huì)有序的自動(dòng)生成對應(yīng)的標(biāo)簽赁严;創(chuàng)建一個(gè)標(biāo)簽控制器扰柠,就默認(rèn)創(chuàng)建一個(gè)標(biāo)簽欄,標(biāo)簽欄最多顯示5個(gè)標(biāo)簽

2.2.2 UITabBar常用的屬性和方法

// 代理
@property(nonatomic,assign) id<UITabBarDelegate> delegate;
// 設(shè)置數(shù)據(jù)模型疼约,不能給系統(tǒng)默認(rèn)創(chuàng)建的UITabBar設(shè)置items
@property(nonatomic,copy) NSArray *items;
// 設(shè)置選中數(shù)據(jù)模型卤档,不能給系統(tǒng)默認(rèn)創(chuàng)建的UITabBar設(shè)置selectedItem
@property(nonatomic,assign) UITabBarItem *selectedItem;
// iOS7之前,tintColor可以修改背景色
@property(nonatomic,retain) UIColor *tintColor;
// iOS7之后程剥,修改背景色只能用barTintColor
@property(nonatomic,retain) UIColor *barTintColor;
// 設(shè)置UITabBar的背景圖片
@property(nonatomic,retain) UIImage *backgroundImage
// 設(shè)置選中的按鈕的背景圖片
@property(nonatomic,retain) UIImage *selectionIndicatorImage
// 設(shè)置陰影圖片劝枣,但必須設(shè)置backgroundImage屬性
@property(nonatomic,retain) UIImage *shadowImage
// 設(shè)置數(shù)據(jù)模型,不能給系統(tǒng)默認(rèn)創(chuàng)建的UITabBar設(shè)置items
- (void)setItems:(NSArray *)items animated:(BOOL)animated;

代理方法:

// 選中時(shí)調(diào)用
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
// 即將編輯時(shí)調(diào)用
- (void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items;  
// 編輯時(shí)調(diào)用                  
- (void)tabBar:(UITabBar *)tabBar didBeginCustomizingItems:(NSArray *)items; 
// 即將結(jié)束編輯時(shí)調(diào)用        
- (void)tabBar:(UITabBar *)tabBar willEndCustomizingItems:(NSArray *)items changed:(BOOL)changed; 
// 結(jié)束編輯時(shí)調(diào)用
- (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray *)items changed:(BOOL)changed;

2.2.3 UITabBarItem

----------  UITabBarItem的常用接口

@interface UITabBarItem : UIBarItem

// 設(shè)置選中圖片
@property(nonatomic,retain) UIImage *selectedImage;
// 設(shè)置角標(biāo)织鲸,一般用于提示用戶有新消息
@property(nonatomic,copy) NSString *badgeValue;
// 初始化UITabBarItem對象
- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image tag:(NSInteger)tag;
// 初始化UITabBarItem對象
- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage;
// 初始化UITabBarItem對象
- (instancetype)initWithTabBarSystemItem:(UITabBarSystemItem)systemItem tag:(NSInteger)tag;

@end

----------  UIBarItem的常用接口

@interface UIBarItem : NSObject

// 是否有效
@property(nonatomic,getter=isEnabled) BOOL enabled;
// 設(shè)置標(biāo)題
@property(nonatomic,copy) NSString *title;
// 設(shè)置圖片
@property(nonatomic,retain) UIImage *image;
// 設(shè)置橫向圖片
@property(nonatomic,retain) UIImage *landscapeImagePhone; 
// 設(shè)置圖片邊距
@property(nonatomic) UIEdgeInsets imageInsets;
// 設(shè)置橫向圖片邊距
@property(nonatomic) UIEdgeInsets landscapeImagePhoneInsets;
// 設(shè)置對應(yīng)的控制器的標(biāo)簽
@property(nonatomic) NSInteger tag;

@end


----------  UITabBarSystemItem的枚舉類型

typedef NS_ENUM(NSInteger, UITabBarSystemItem) {
    UITabBarSystemItemMore,
    UITabBarSystemItemFavorites,
    UITabBarSystemItemFeatured,
    UITabBarSystemItemTopRated,
    UITabBarSystemItemRecents,
    UITabBarSystemItemContacts,
    UITabBarSystemItemHistory,
    UITabBarSystemItemBookmarks,
    UITabBarSystemItemSearch,
    UITabBarSystemItemDownloads,
    UITabBarSystemItemMostRecent,
    UITabBarSystemItemMostViewed,
};

2.2.4 覆蓋UITabBarController自帶的tabBar為自定義的tabBar操作原理

tabBar上的按鈕是在viewDidAppear的時(shí)候拿到 self.tabBar 再調(diào)用addSubViews添加上去的舔腾,在viewDidAppear之前把控制器的tabBar換成我們自己的tabBar,就會(huì)把tabBar上的按鈕添加到自己的tabBar上昙沦。但是tabBar控制器的tabBar屬性是只讀的琢唾,不能直接賦值,可以利用運(yùn)行時(shí)機(jī)制發(fā)送消息

三盾饮、應(yīng)用

-(void)RTSetUpSubVcs{
    TGHomeViewController *HomeVC = [[TGHomeViewController alloc]init];
    HomeVC.view.backgroundColor = [UIColor whiteColor];
    BSENavigationController *HomeNav = [self ChildVC:HomeVC
                                           WithTitle:@"今托管"
                                               image:@"tabbar_search"
                                       selectedImage:@"tabbar_search_sel"];
    
    TGRootChildrenViewController *childrenVC = [TGRootChildrenViewController new];
    BSENavigationController *childrenNav = [self ChildVC:childrenVC
                                               WithTitle:@"小孩"
                                                   image:@"tabBar_children"
                                           selectedImage:@"tabBar_children_sel"];
    
    TGMineViewController *MyVC = [TGMineViewController new];
    BSENavigationController *MyNav = [self ChildVC:MyVC
                                         WithTitle:@"我的"
                                             image:@"tabBar_mine"
                                     selectedImage:@"tabBar_mine_sel"];
    self.tabBar.barTintColor = [UIColor whiteColor];//tabbar 背景色
    self.tabBar.translucent = NO;//tarbar非透明
    
    self.viewControllers = @[HomeNav,childrenNav,MyNav];
}

#pragma mark  - 根TabBarController 添加子視圖
-(BSENavigationController *)ChildVC:(UIViewController *)VC WithTitle:(NSString *)title image:(NSString *)imagename selectedImage:(NSString *)selectedImageName
{
    VC.title = title;
    UITabBarItem *barItem = [[UITabBarItem alloc]init];
    barItem.title = title;
    barItem.image = [[UIImage imageNamed:imagename]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    barItem.selectedImage = [[UIImage imageNamed:selectedImageName]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [barItem setTitleTextAttributes:@{NSForegroundColorAttributeName: HEXCOLOR(0x666666)} forState:UIControlStateNormal];
    // 選中狀態(tài)下的文字顏色
    [barItem setTitleTextAttributes:@{NSForegroundColorAttributeName: HEXCOLOR(kBlueGrayColor)} forState:UIControlStateSelected];
    BSENavigationController *Nav = [[BSENavigationController alloc]initWithRootViewController:VC];
    Nav.tabBarItem = barItem;
    return Nav;
}

四采桃、遇到的問題


1.之前初始化寫錯(cuò)了添加子控制器的方法懒熙,設(shè)置了子控制的backgroundColor 導(dǎo)致 tabbarcontroller初始化所有子控制進(jìn)入了didload方法。這樣的直接壞處就是多數(shù)子控制器在didload里面都有網(wǎng)絡(luò)請求方法普办,并且接口都有登錄權(quán)限設(shè)置工扎,如果初始化都直接加載,在用戶登錄成功后所有控制器又要在登錄成功后衔蹲,重新加載一次網(wǎng)絡(luò)請求肢娘。浪費(fèi)性能,同時(shí)也增加了程序的復(fù)雜度舆驶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橱健,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沙廉,更是在濱河造成了極大的恐慌拘荡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撬陵,死亡現(xiàn)場離奇詭異珊皿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巨税,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蟋定,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人草添,你說我怎么就攤上這事驶兜。” “怎么了果元?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵促王,是天一觀的道長犀盟。 經(jīng)常有香客問我而晒,道長,這世上最難降的妖魔是什么阅畴? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任倡怎,我火速辦了婚禮,結(jié)果婚禮上贱枣,老公的妹妹穿的比我還像新娘监署。我一直安慰自己,他們只是感情好纽哥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布钠乏。 她就那樣靜靜地躺著,像睡著了一般春塌。 火紅的嫁衣襯著肌膚如雪晓避。 梳的紋絲不亂的頭發(fā)上簇捍,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音俏拱,去河邊找鬼暑塑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锅必,可吹牛的內(nèi)容都是我干的事格。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼搞隐,長吁一口氣:“原來是場噩夢啊……” “哼驹愚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劣纲,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤么鹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后味廊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸甜,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年余佛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柠新。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辉巡,死狀恐怖恨憎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郊楣,我是刑警寧澤憔恳,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站净蚤,受9級特大地震影響钥组,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜今瀑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一程梦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橘荠,春花似錦屿附、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贮懈,卻和暖如春匀泊,著一層夾襖步出監(jiān)牢的瞬間影暴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工探赫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留型宙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓伦吠,卻偏偏與公主長得像妆兑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子毛仪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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