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是设定的任意颜色