iOS-UITabBarViewController大總結
一、UITabBarController的初印象
UITabBarController和UINavigationController類似,UITabBarController也可以輕鬆地管理多個控制器,輕鬆完成控制器之間的切換,典型的例子就是QQ、微信等應⽤。但是.前者其管理的檢視一直存在,而後者在pop後會銷燬掉,釋放記憶體.
注意:UITabBarController通常作為整個程式的rootViewController,而且不能新增到別的container viewController中。.
二、UITabBarController的使用:
1、使用步驟:
(1)初始化UITabBarController
(2)設定UIWindow的rootViewController為UITabBarController
(3)建立相應的子控制器(viewcontroller)
(4)把子控制器新增到UITabBarController
2、程式碼示例
新建一個空的UITabBarController,在控制器中編碼
-(void) viewDidLoad {
MapViewController *v1 = [MapViewControllernew];
v1.tabBarItem.image = [UIImageimageNamed:@"icon_map"];
v1.tabBarItem.title = @"地圖";
v1.view.backgroundColor = [UIColororangeColor];
CycleViewController *v2 = [CycleViewControllernew];
v2.tabBarItem.image = [UIImageimageNamed:@"icon_cycle"];
v2.tabBarItem.title = @"運動";
v2.view.backgroundColor = [UIColorgreenColor];
OtherViewController *v3 = [OtherViewControllernew];
v3.tabBarItem.image = [UIImageimageNamed:@"icon_other"];
v3.tabBarItem.title = @"活動";
v3.view.backgroundColor = [UIColoryellowColor];
MineViewController *v4 = [MineViewControllernew];
v4.tabBarItem.image = [UIImageimageNamed:@"icon_user"];
v4.tabBarItem.title = @"我的";
v4.view.backgroundColor = [UIColorredColor];
UINavigationController *n1 = [[UINavigationControlleralloc] initWithRootViewController:v1];
UINavigationController *n2 = [[UINavigationControlleralloc] initWithRootViewController:v2];
UINavigationController *n3 = [[UINavigationControlleralloc] initWithRootViewController:v3];
UINavigationController *n4 = [[UINavigationControlleralloc] initWithRootViewController:v4];
NSArray *array = @[n1,n2,n3,n4];
self.viewControllers = array;
}
這樣就把四個帶有導航控制器的tabBarController建立好了,只需在Appdelegate裡面把該UITbarBarcontroller控制器設定為跟檢視控制器。
self.window.rootViewController = [[UITbarBarcontroller alloc] init];
三、重要說明
1、UITabBar
下方的工具條稱為UITabBar ,如果UITabBarController有N個子控制器,那麼UITabBar內部就會有N 個UITabBarButton作為子控制元件與之對應(不過最下邊最多顯示5個,多了就是隱藏在最後一欄裡面,可以點開檢視)。
注意:UITabBarButton在UITabBar中得位置是均分的,UITabBar的高度為49。
2、UITabBarButton
UITabBarButton⾥面顯⽰什麼內容,由對應子控制器的tabBarItem屬性來決定
c1.tabBarItem.title=@"訊息";
c1.tabBarItem.image=[UIImage imageNamed:@"tab_recent_nor"];
UITabBarItem有以下屬性影響UITabBarButton的內容:
title(標題)、image(圖示)、selectImage(選中時的圖示)、badgeValue(提醒數字)
3、有兩種方式可以往UITabBarController中新增子控制器
(1)[tb addChildViewController:c1];
(2)tb.viewControllers=@[c1,c2,c3,c4];
注意:展示的順序和新增的順序一致,和導航控制器中不同,展現在眼前的是第一個新增的控制器對應的View。
3、UITabBarItem
-
UITabBarItemUITabBar上面顯示的每一個Tab都對應著一個ViewController,我們可以通過設定viewcontroller.tabBarItem屬性來改變tabbar上對應的tab顯示內容。
否則系統將會根據viewController的title自動建立一個,該tabBarItem只顯示文字,沒有影像,但是影像的位置會預留出來。
當我們自己建立UITabBarItem的時候,我們可以顯示的指定顯示的影像和對應的文字描述。
當然還可以通過setFinishedSelectedImage:withFinishedUnselectedImage:方法給選中狀態和飛選中狀態指定不同的圖片。
UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Second" image:nil tag:2];
[item setFinishedSelectedImage:[UIImage imageNamed:@"second"] withFinishedUnselectedImage:[UIImage imageNamed:@"first"]];
viewController2.tabBarItem = item;
四、Change SelectedViewcontroller(改變當前選中的控制器)
改變UITabBarController中當前顯示的viewController,可以通過一下兩種方法:
1、selectedIndex屬性
- 通過該屬性可以獲得當前選中的viewController,設定該屬性,可以顯示viewControllers中對應的index的viewController。
- 如果當前選中的是MoreViewController的話,該屬性獲取出來的值是NSNotFound,而且通過該屬性也不能設定選中MoreViewController。設定index超出viewControllers的範圍,將會被忽略。
2、selectedViewController屬性
- 通過該屬性可以獲取到當前顯示的viewController,通過設定該屬性可以設定當前選中的viewController,同時更新selectedIndex。
- 可以通過給該屬性賦值tabBarController.moreNavigationController可以選中moreViewController。
3、viewControllers屬性
設定viewControllers屬性也會影響當前選中的viewController,設定該屬性時UITabBarController首先會清空所有舊的viewController,然後部署新的viewController,接著嘗試重新選中上一次顯示的viewController,如果該viewController已經不存在的話,會接著嘗試選中index和selectedIndex相同的viewController,如果該index無效的話,則預設選中第一個viewController。
五、 moreNavigationController
- UITabBar上最多可以顯示5個Tab,當我們往UITabBarController中新增的viewController超過5個時候,最後一個就會自動變成
more
,按照設定的viewControlles的順序,顯示前四個viewController的tabBarItem,後面的tabBarItem將不再顯示。當點選more時候將會彈出一個標準的navigationViewController,裡面放有其它未顯示的的viewController,並且帶有一個edit按鈕,通過點選該按鈕可以進入類似與ipod程式中設定tabBar的編輯介面。 - 編輯介面中預設所有的viewController都是可以編輯的,我們可以通過設定UITabBarController的customizableViewControllers屬性來指定viewControllers的一個子集,即只允許一部分viewController是可以放到tabBar中顯示的。但是這塊兒要注意一個問題就是每當UITabBarController的viewControllers屬性發生變化的時候,customizableViewControllers就會自動設定成跟viewControllers一致,即預設的所有的viewController都是可以編輯的,如果我們要始終限制只是某一部分可編輯的話,記得在每次viewControlles發生改變的時候,重新設定一次customizableViewControllers。
六、UITabBarController的Rotation
- UITabBarController預設只支援豎屏,當裝置方向放生變化時候,它會查詢viewControllers中包含的所有ViewController,僅當所有的viewController都支援該方向時,UITabBarController才會發生旋轉,否則預設的豎向。
- 此處需要注意當UITabBarController支援旋轉,而且發生旋轉的時候,只有當前顯示的viewController會接收到旋轉的訊息。
七、UITabBarControllerDelegate
- 這兩個方法我之前在專案中做過 每次開啟APP時,根據後臺資料,改變指定的tabbar的image, 點選後改變其image.
- tabBarController:shouldSelectViewController:
- tabBarController:didSelectViewController:
- 下面這三個方法主要用於監測對moreViewController中對view controller的edit操作
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers;
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed;
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed;
相關文章
- 【總結】二叉樹概念大總結二叉樹
- css常用大總結CSS
- 大前端效能總結前端
- sql大賽總結SQL
- 《大話資料結構》總結資料結構
- http headers 大總結HTTPHeader
- Vue.js大總結Vue.js
- C語言大總結C語言
- 臨時表大總結
- 排程管理大總結
- 【多執行緒總結(四)-三大性質總結】執行緒
- Io流階段大總結
- java四大引用總結Java
- python異常大總結Python
- 大資料開源框架特點大總結大資料框架
- 前端大廠面試一點總結前端面試
- IT大咖總結的面試真經面試
- 演算法Tips大總結演算法
- 大規模爬蟲流程總結爬蟲
- 天池大資料比賽總結大資料
- 機器學習之開源庫大總結機器學習
- 5大常用演算法總結演算法
- Java 四大域物件總結Java物件
- Ulipad快捷鍵大總結iPad
- 《大話資料結構》讀後總結(七)資料結構
- 《大話資料結構》讀後總結(五)資料結構
- 《大話資料結構》讀後總結(六)資料結構
- 《大話資料結構》讀後總結(八)資料結構
- 《大話資料結構》讀後總結(九)資料結構
- 《大話資料結構》讀後總結(三)資料結構
- 《大話資料結構》讀後總結(四)資料結構
- 《大話資料結構》讀後總結(一)資料結構
- 個人技術棧大體思路總結
- 大資料基礎架構總結大資料架構
- 軟體測試基礎大總結
- ❀ Spring5學習大總結Spring
- java基礎使用的集合大總結Java
- 八大基礎排序總結排序