UITabBarController和UINavigationController的區別

UITabBarController 和UINavigationController均可以做爲 window的根控制器(rootViewController),但界面內容的展現樣式是不一樣的。其區別以下:web

1 UITabBarController的導航欄展現位置在屏幕的下方;而UINavigationController的導航欄展現位置在屏幕的上方。app

2 UITabBarController的下一級控制器是其子控制器,能夠有多個子控制器,默認子控制器展現   的順序從第一個依次排放展現;UINavigationController的下一級控制器是其rootViewController,且只有一個根控制器。ide

3 當UITabBarController做爲window的根控制器時,其子控制器能夠是UINavigationController,也能夠是普通控制器,也能夠是兩種類型的控制器都存在;可是在界面的效果是不同的。當子控制器是UINavigationController時,其對應的界面會在屏幕的上方顯示nav導航欄,而且不一樣的UINavigationController子控制器的nav導航欄能夠設置不一樣的顯示內容;而子控制器是普通控制器的界面不會展現nav導航欄。atom

4 當UINavigationController做爲window的根控制器時,其rootViewController只能從UITabBarController和普通控制器中選擇一種類型,由於器其rootViewContrlller只有一個。當選擇UITabBarController時,而UITabBarController的子控制器在各自的控制器界面展現時,公有一個相同的nav導航欄在屏幕的上方,其內容是固定的,也是同樣的。在屏幕的下方展現的是UITabBarController的子控制器spa

5 UIViewController的一個特別屬性:當UIViewController的父控件,父父控件(即其上一級,上上一級等更高級控件)爲tab bar controller,則該UIViewController就有一個屬性UITabBarController *tabBarController,能夠根據tabBarController對整個屏幕處理事件,tabBarController是控制器中的底層控制器了繼承

6 關於bottomBar隱藏的處理方法 :當控制器是被一個帶有tabBar導航欄的控制器push出來時,系統默認,該控制器會展現bottomBar,要隱藏該bottomBar,處理方法有:                                   1)使用viewController的bool屬性:hidesBottomBarWhenPushed;具體是:                            - (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated事件

{get

    viewController.hidesBottomBarWhenPushed = YES;it

    [super pushViewController:viewController animated:animated];io

}                                                                                                                                                     2) 當window的根控制器是UITabBarController,而UITabBarController的子控制器有UINavigationController,則該nav控制器push出來的控制器要隱藏bottomBar,也可使用方法:

- (void)pushViewController:(nonnull UIViewController *)viewController animated:(BOOL)animated{

    [super pushViewController:viewController animated:animated];

        self.tabBarController.tabBar.hidden = YES;

}

使用上述兩種方式bottomBar仍是隱藏效果很差,使用終極方法:直接將最原始的tabBar隱藏掉,達到一鍵必除的效果。使用下面的代碼,保證必有效果:

- (void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    [self.tabBarController.tabBar setHidden:YES];

}

7 當UINavigationController的根控制器又push不少的控制器(好比經過點擊某個按鈕而push出控制器)時,這時全部push出的控制器都會有navigationItem,且其樣式是基本相同的,和UINavigationController中的設置是保持一致的;可是若是UINavigationController的根控制器是經過modal出來的控制器,則navigationItem不會在modal出來的控制器中顯示。此時若是想讓navigationItem也顯示在屏幕的上方,能夠有兩種方式:

1) 再也不使用modal方式,直接使用push方式

self.navigationController pushViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#>

2) 仍是使用modal方式添加控制器,可是,對要modal的控制器進行一個navController的包裝。以下面的狀況:MYNavigationController是一個自定義的UINavigationController,self指的是一個任意的控制器(普通控制器 導航控制器),webController是要modal出的普通控制器

  MYNavigationController *navWebController = [[MYNavigationController alloc] initWithRootViewController:webController];

    [self      presentModalViewController:navWebController animated:YES];

8 關於navigationItem上的UIBarButtonItem按鈕的問題:UINavigationItem上的常見的幾個按鈕屬性:

@property(nullable,nonatomic,strong) UIBarButtonItem *backBarButtonItem;

@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;

@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;

@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);

@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);

這些按鈕在navigationItem上的位置,可使用兩種方式來處理:MYSettingController是MYMyLotteryController經過MYMyLotteryController的navigationItem導航欄的一個設置按鈕push出來的控制器。如今須要在MYSettingController的navigationItem導航欄上增長個右按鈕叫作」常見問題"按鈕,即navigationItem.rightBarButtonItem爲常見按鈕。處理方式爲:

1)直接在MYSettingController的navigationItem導航欄上添加UIBarButtonItem常見問題按鈕,可是這種方式一個缺點是,全部繼承自MYSettingController的子控制器都會存在這個UIBarButtonItem常見問題按鈕,可能有些子控制器並不須要這個按鈕,所以這樣作就不理想了

#import "MYSettingController.h"

   UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"常見問題" style:0 target:self action:@selector(itemClick)];

    self.navigationItem.rightBarButtonItem = item;

2)在MYMyLotteryController控制器中添加,這種方式可讓UIBarButtonItem常見問題按鈕在子控制器中不顯示。

#import "MYMyLotteryController.h"

 MYSettingController * settingController = [[MYSettingController alloc] init];

    settingController.title = @"設置";

 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"常見問題" style:0 target:self action:@selector(itemClick)];

    settingController.navigationItem.rightBarButtonItem = item;

    [self.navigationController pushViewController:settingController animated:YES];

 

9 設置導航欄的tintColor的方法:nav的導航欄底層顏色:[[UINavigationBar appearance] setBarTintColor:themeColor];  tabBar的導航欄的顏色: [[UITabBar appearance] setTintColor:themeColor];  其中themeColor是設定的任意顏色

相關文章
相關標籤/搜索