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是設定的任意顏色