iOS應(yīng)用開發(fā)中UITabBarController標(biāo)簽欄控制器使用進階
做了這么長時間的ios開發(fā)了,最基本的UITabBarController和UINavigationController都用了好長時間了,總是改現(xiàn)成的代碼,或者各種自定義控件的修改,用的都有些混亂了,呵呵。還是自己做個demo再復(fù)習(xí)一下吧,記錄下來以備后續(xù)翻查。
一、UITabBarController和UINavigationController的聯(lián)合使用
這種方法最常見,好像一般有tabbar都會有naviBar。一般使用,
1. 在appDelegate里面創(chuàng)建UITabBarController; 準(zhǔn)備好ViewControllerArray等其它數(shù)據(jù)變量;
[/code]
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate = nil;
UINavigationController *naviController = nil;
NSMutableArray *controllerArray = [[NSMutableArray alloc] initWithCapacity:3];
[/code]
2.創(chuàng)建每個tab對應(yīng)的viewController和以該viewController為根視圖控制器的UINavigationController; 將naviController添加到數(shù)組中; 定制每個UITabBarItem,可以設(shè)置圖片、文字、標(biāo)記等;
如下:tab1和tab3的創(chuàng)建類似
SecondTabViewController *secondController = [[SecondTabViewController alloc] initWithStyle:UITableViewStylePlain];
naviController = [[UINavigationController alloc] initWithRootViewController:secondController];
// UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"tab2.png"] tag:2];
UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:2];
naviController.tabBarItem = secondTab;
secondController.navigationItem.title = @"second tab";
[secondTab release];
[controllerArray addObject:naviController];
[naviController release];
[secondController release];</span>
3. 將viewController數(shù)組設(shè)置給tabBarController,tabBarController添加到窗口顯示。
tabBarController.viewControllers = controllerArray;
[controllerArray release];
[self.window addSubview:tabBarController.view];
完成,顯示效果如下。
4. UITabBarController和naviController不是一定綁定在一起用的。
naviController.tabBarItem = secondTab;
從上面這句話就可以看出來,我理解這句才是將tab和viewController連接起來的關(guān)鍵,但是每個UIViewController本身都會自動創(chuàng)建一個tabBarItem,因此secondController.tabBarItem = secondTab也是可以的,這就可以實現(xiàn)只有UITabBarController,而沒有naviController。如下圖所示
UITabBarController.h中的相關(guān)定義,可以驗證這種用法。
@interface UIViewController (UITabBarControllerItem)
@property(nonatomic,retain) UITabBarItem *tabBarItem; // Automatically created lazily with the view controller's title if it's not set explicitly.
二、UITabBar和UITabBarItem的一些設(shè)置。
設(shè)置UITabBar的背景,網(wǎng)上流傳最多的方法是取出UITabBar之后,對其layer層的contents屬性進行修改,將其設(shè)置為自定義的一張背景圖片,如下面注視掉的代碼。不過看了頭文件之后我覺得這種方法好像挺奇怪的,雖然也沒幾句代碼,不過感覺不用這么復(fù)雜吧??取出UITabBar之后直接設(shè)置backgroundImage不就行了么?或許有潛在問題我不知道吧,先了解有這種方法吧,以備不時之需。
UITabBar *tabBar = (UITabBar*)[[tabBarController.view subviews] objectAtIndex:1];
//tabBar.layer.contents = (id)[UIImage imageNamed:@"tabbar_background.png"].CGImage;
tabBar.backgroundImage = [UIImage imageNamed:@"tabbar_background.png"];
UITabBarItem有兩種初始化方式,本代碼中使用的是設(shè)置系統(tǒng)tab類型,另一種更常用的應(yīng)該是定制tab標(biāo)題和圖片,如上注釋掉的語句。
//UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"tab2.png"] tag:2];
UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:2];
可以通過下面的函數(shù)設(shè)置選中、未選中的圖片; 字符串badgeValue是可以在tab右上角的紅色小圓圈內(nèi)的文字內(nèi)容
<span style="font-size:16px;"> [firstTab setFinishedSelectedImage:[UIImage imageNamed:@"tab1_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"tab1.png"]];
firstTab.badgeValue = @"3";
這幾個控件的屬性不多,還有可以UITabBar選中的圖片、顏色等等,通過頭文件注釋看到的,沒有實際使用,大概使用方法都差不多。
三、自定義UITabBar
實際工作中,還是用純粹的自定義TabBar的情況更多,在此先寫寫思路,整理好代碼再來記錄。
第一種思路,也是我現(xiàn)在使用的,自定義TabBar繼承UIView,每個tab是一個button,從而可以設(shè)置選中/未選中的圖片,將button都添加到TabBar里面,button的點擊事件就可以作為tab是否被選中的觸發(fā)事件,通過delegate通知外面到底選中了哪個tab。
第二種思路,既然UITabBar本身就是UIView的子類,應(yīng)該可以重寫drawRect函數(shù)完全自繪吧,這也是一種思路,好像一些開源代碼也是這樣做的。
還有一些情況,可能使用UIToolBar來代替TabBar更合適,toolBar可以設(shè)置自定義的view,那就好辦了,估計搞個UIActivityIndicatorView之類的設(shè)置上去都行,下一步要看看這塊的文檔和代碼,嘗試一下,寫了demo再來記錄。
四、總結(jié)UITabBarController的注意點
使用UITabBarController和使用一般的控制器一樣,比如可以設(shè)置
self.window.rootViewController = tabBarController;
使用addChildViewController方法可以給其添加子控制器。每個子控制器對應(yīng)一個UITabBarButton,也就是在UITabBarController下面的選項。此時如果想要改變UITabBarButton的內(nèi)容,比如想要設(shè)置title, image等內(nèi)容,需要在其對應(yīng)的子控制器里面通過修改tabBarItem的屬性來設(shè)置內(nèi)容。
// JYViewController.m -> 是UITabBarController的子控制器
- (void)viewDidLoad
{
[super viewDidLoad];
self.tabBarItem.title = @"選項1";
self.tabBarItem.badgeValue = @"1";
}
這一點和UINavigationController是類似的,在使用UINavigationController的時候,我們在當(dāng)前顯示的控制器(也就是棧頂?shù)目刂破鳎┲型ㄟ^修改navigationItem來設(shè)置導(dǎo)航欄中的內(nèi)容。
self.navigationItem.leftBarButtonItem = ...;
也就是說,使用UINavigationController和UITabBarController的時候:
在其對應(yīng)的控制器里面修改導(dǎo)航欄和tabBar的內(nèi)容。
通過修改tabBarItem和__navigationItem__的屬性來設(shè)置導(dǎo)航欄和tabBar的內(nèi)容。其實tabBarItem和navigationItem屬于模型(從NSObject繼承,以...Item結(jié)尾的可以都推測為模型?),此時我們通過修改模型來修改view中顯示的內(nèi)容。
當(dāng)UINavigationController和UITabBarController同時使用的時候,如果讓navigationController作為self.window.rootViewController,然后再讓tabBarController成為navigationController的子控制器,這么做是合法的,但是會有一些問題。
因為前面說過,navigationBar上顯示的內(nèi)容是通過在其當(dāng)前顯示的子控制器中修改的,但是此時navigationController直接顯示的子控制器是tabBarController,所以當(dāng)進入不同的界面的時候,我們希望navigationBar上的內(nèi)容(比如title)改變,但是此時是做不到的,因為我們無法在UITabBarController中修改navigationBar的內(nèi)容。
所以一般來說我們會讓tabBarController作為根控制器,如果其他自定義的子控制器需要navigationController,那么就讓每個自定義的控制器對應(yīng)的navigationController作為tabBarController的子控制器,然后讓自定義的控制器作為navigationController的子類。這樣就可以在自定義控制器中修改navigationController的navigationBar顯示內(nèi)容。
- 實例講解iOS中的UIPageViewController翻頁視圖控制器
- iOS開發(fā)中導(dǎo)航控制器的基本使用教程
- 詳解iOS開發(fā)中使用storyboard創(chuàng)建導(dǎo)航控制器的方法
- 學(xué)習(xí)iOS自定義導(dǎo)航控制器UINavigationController
- iOS開發(fā)中的ViewController轉(zhuǎn)場切換效果實現(xiàn)簡介
- iOS AVPlayer切換播放源實現(xiàn)連續(xù)播放和全屏切換的方法
- iOS使用pageViewController實現(xiàn)多視圖滑動切換
- 比較IOS開發(fā)中常用視圖的四種切換方式
- iOS 頁面滑動與標(biāo)題切換顏色漸變的聯(lián)動效果實例
- iOS實現(xiàn)多控制器切換效果
相關(guān)文章
iOS應(yīng)用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)
AFNetworking庫是Objective-C語言寫成的用于處理HTTP的第三方庫,在GitHub上開源并且一直在被更新和維護,下面就一起來看一下iOS應(yīng)用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)2016-05-05IOS開發(fā)之tableView點擊行跳轉(zhuǎn)并帶有“顯示”更多功能
這篇文章給大家介紹通過點擊城市中的tableView跳轉(zhuǎn)到旅游景點的tableView,下面會有“顯示”更多的功能,代碼簡單易懂,對ios點擊tableview跳轉(zhuǎn)相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-03-03iOS獲取當(dāng)前網(wǎng)絡(luò)環(huán)境的實現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄猧OS獲取當(dāng)前網(wǎng)絡(luò)環(huán)境的實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04