UITabBarController用法詳解 - iOS - UI基礎知識總結15

UITabBarController是IOS中很常用的一個viewController,例如系統的鬧鐘程序,ipod程序等。UITabBarController通常作爲整個程序的rootViewController,而且不能添加到別的container viewController中(在後面會詳細解釋)


先通過UITabBarController的層級圖來分析一下它的結構組成

它是由下方的TabBar和用來顯示內容的Custom content組成,整個界面又可以認爲是TabBarController的顯示視圖

下面先說一下標籤控制器和導航控制器在使用上的區別:

1、導航視圖控制器,管理的控制器之間存在層級關係(依賴關係)
     標籤視圖控制器,管理的控制器之間是並列關係(同時存在,互不干擾)
     2、管理方式
     導航控制器以棧的形式管理多個試圖控制器,push入棧,pop出棧,當返回上一界面時,空間回收
     標籤視圖控制器,以不可變數組管理,而且創建時必須要全部指定所管理的多個視圖控制器,而且多個視圖控制器同時存在,空間不回收
     3、視圖控制器之間的嵌套
     正常用法:標籤視圖控制器管理多個導航控制器,每個導航控制器又管理多個單視圖控制器(每個界面都有導航條,導航條都是不同的,單視圖控制器可以自定義導航內容)
     非常用法:導航控制器管理標籤控制器,標籤控制器用來管理多個單視圖控制器(每個界面都有導航條,但是導航條都是一樣的,單視圖控制器不可以自定義導航條內容),這種用法不符合邏輯,很少使用
     
     導航控制器、標籤控制器都是多視圖控制器,可以管理多個視圖控制器,但是UITableViewController、UIViewController是單視圖控制器,不可以管理視圖控制器,只能管理視圖


接下來再熟悉一下視圖下面的UITabBar的結構組成

注意:UITabBarButton在UITabBar中得位置是均分的,UITabBar的高度爲49


注意:UITabBarButton的一些屬性是通過tabBarItem來改變的(後面的代碼會詳細介紹用法)

下面主要說一下UITabBar的注意事項:

1、UITabBar上最多可以顯示5個TabBarButton,當我們往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。

2、UITabBarController默認只支持豎屏,當設備方向放生變化時候,它會查詢viewControllers中包含的所有ViewController,僅當所有的viewController都支持該方向時,UITabBarController纔會發生旋轉,否則默認的豎向

此處需要注意當UITabBarController支持旋轉,而且發生旋轉的時候,只有當前顯示的viewController會接收到旋轉的消息

3、如果UITabBarController有N個子控制器,那麼UITabBar內部就會有N 個UITabBarButton作爲子控件與之對應,點擊對應的UITabBarButton就會顯示對應的視圖
     UITabBar自己有一些方法是可以改變自身狀態,但是對於UITabBarController自帶的tabBar,我們不能直接去修改其狀態。任何直接修改tabBar的操作將會拋出異常


接下來用代碼表述UITabBarController的用法:

// 1、創建3個單視圖控制器,分別加到對應的導航控制器上
    FirstViewController *firstVC = [[[FirstViewController alloc]init]autorelease];
    UINavigationController *firstNav = [[[UINavigationController alloc]initWithRootViewController:firstVC]autorelease];
    firstVC.view.backgroundColor = [UIColor redColor];
    
    SecondViewController *secondVC = [[[SecondViewController alloc]init]autorelease];
    UINavigationController *secondNav = [[[UINavigationController alloc]initWithRootViewController:secondVC]autorelease];
    secondVC.view.backgroundColor = [UIColor orangeColor];
    
    ThirdViewController *thirdVC = [[[ThirdViewController alloc]init]autorelease];
    UINavigationController *thirdNav = [[[UINavigationController alloc]initWithRootViewController:thirdVC]autorelease];
    thirdVC.view.backgroundColor = [UIColor cyanColor];
    
    // 2、創建一個不可變數組,裝入3個導航控制器
    NSArray *controllers = @[firstNav, secondNav, thirdNav];
    
    // 3、創建一個標籤視圖控制器
    UITabBarController *tabBarController = [[[UITabBarController alloc]init]autorelease];
    
    // 4、設置標籤控制器的被控制對象(3個導航控制器)
    tabBarController.viewControllers = controllers;
    
    // 5、將標籤控制器設置爲window的根視圖
    self.window.rootViewController = tabBarController;
    
    
    
    // 設置標籤視圖控制器的一些屬性:
    
    // 設置三個導航控制器在tabBarController上的按鈕的標題和背景圖片
    firstNav.tabBarItem.title = @"First";
    firstNav.tabBarItem.image = [UIImage imageNamed:@"qr_toolbar_light_up_hl"];
    
    secondNav.tabBarItem.title = @"Second";
    secondNav.tabBarItem.image = [UIImage imageNamed:@"tabbar_contacts"];
    
    thirdNav.tabBarItem.title = @"Third";
    thirdNav.tabBarItem.image = [UIImage imageNamed:@"tabbar_discover"];
    
    // 設置標籤欄的渲染顏色(圖標點擊後的顏色)
    tabBarController.tabBar.tintColor = [UIColor purpleColor];
    
    // 設置整個tabBar的顏色(如果不設置,tabBar默認是毛玻璃效果)
//    tabBarController.tabBar.barTintColor = [UIColor whiteColor];
    
    // 設置某個tabBarItem的右上角的小角標內容(NSString)
    firstNav.tabBarItem.badgeValue = @"新消息";
    
    // 有兩種方式可以往UITabBarController中添加子控制器
    UIViewController *con1 = [[UIViewController alloc]init];
    con1.view.backgroundColor = [UIColor grayColor];
    UINavigationController *nav1 = [[UINavigationController alloc]initWithRootViewController:con1];
    [con1 release];
    nav1.tabBarItem.title = @"第四個按鈕";
    // 第一種添加方法(該方法如果放在方法tabBarController.viewControllers = controllers之後,設置無效,原因不詳)
//    [tabBarController addChildViewController:nav1];
    // 第二種添加方法(該方法重新設置了viewControllers,會把前面的設置覆蓋,所以也可以用這個方法刪除某個按鈕)
//    tabBarController.viewControllers = @[firstNav, secondNav, thirdNav, nav1];
    
    // 設置tabBar的樣式(沒多大用處)
    tabBarController.tabBar.barStyle = UIBarStyleDefault;
    /*
     UIBarStyleDefault
     UIBarStyleBlack // 黑色毛玻璃效果
     
     UIBarStyleBlackOpaque
     UIBarStyleBlackTranslucent
     */
    
    // 設置標籤視圖控制器默認選中的標籤(系統默認選擇第0個)
    tabBarController.selectedIndex = 0;
    // 設置標籤視圖控制器默認選中的視圖控制器(效果和選擇標籤一樣)
//    tabBarController.selectedViewController = firstNav;
    
    // 設置代理
    tabBarController.delegate = self;

代理(委託)方法的實現(其中的修改TabBarButton的代理方法只有當TabBarButton的數量是5個或以上時纔有意義)

#pragma mark - tabBarController Delegate
// 將要選中某一個控制器
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    // 設置不讓選中某一個控制器(其實這裏的設置無效:因爲三個按鈕是UINavigationController類型)
    // 這裏只是介紹這種設計思想,讓大家知道有這麼一個方法
//    if ([viewController isKindOfClass:[ThirdViewController class]]) {
//        return NO;
//    }
//    return YES;
    
    // 用別的方法實現
    UINavigationController *nav = (UINavigationController *)[[tabBarController viewControllers] objectAtIndex:2];
    if ([viewController isEqual:nav]) {
        return NO;// 第三個按鈕不讓選擇
    }
    
    return YES;
}
// 已經選中某一個控制器
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    // 如果選擇了第二個控制器,彈出警告
    if (tabBarController.selectedIndex == 1) {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"警告" message:@"18歲以下禁止進入" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
    }
}
// 將要定製這些導航控制器(移動、刪除操作等)
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers
{
    // 查看定製前導航控制器數組的對象的排列順序
    NSLog(@"%@", viewControllers);
}
// 導航控制器定製完成
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{
    // 查看定製後導航控制器數組的對象的排列順序
    NSLog(@"%@", viewControllers);
}

下面是運行的兩個效果圖


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章