iOS-UITabBarViewController大總結

weixin_33936401發表於2016-07-25

一、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;

相關文章