导航控制器
1.UINavigationController
1.1是什么?
是一个能够装载多个视图控制器的容器 (内部用数组装视图控制器按照添加顺序加入数组)
是一种管理视图控制器的控制器
1.2作用?
管理和控制视图控制器的走向,比模态视图present跳转的方式更好,更清晰,层次感更明确;
1.3如何使用导航控制器?
a 创建一个导航控制器对象,并初始化它的根视图控制器(至少必须有一个根视图控制器),
b 把该导航控制器对象设置为窗口的根视图控制器(那么,窗口上默认显示的就是导航控制器所管理的根视图控制器的小跟班view);
c push界面(推出下一个界面)
d pop界面(返回一个界面)
1)返回上一级
2)返回到指定的界面
3)返回到根视图
【Demo】-【1-UINavigationController】
a,b
-
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];//1.创建导航控制器对象
ViewController1 *vc1 = [[ViewController1 alloc] init]; 【导航控制器】
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:vc1];//2.把导航控制器对象作为窗口的根视图控制器(窗口上默认显示的就是导航控制器的根视图控制器所管理的视图)
self.window.rootViewController = nvc;return YES;
}
c push(在点击事件里面写以下内容)
-(void)btnClick{
//创建vc2对象
ViewController2 *vc2 = [[ViewController2 alloc] init];
//push到vc2,由导航控制器来push
[self.navigationController pushViewController:vc2 animated:YES];
}
d pop(在点击事件里面写以下内容)
-(void)btnClick{
//************* 1. 返回到主页面(常用)
[self.navigationController popToRootViewControllerAnimated:YES];
//导航控制器所管理的所有的控制器对象都存放在该数组中
// NSArray *array = self.navigationController.viewControllers;
// NSLog(@"%@",array);
//2.返回到指定的界面
// [self.navigationController popToViewController:array[1] animated:YES];
//3.返回到上一级页面
// [self.navigationController popViewControllerAnimated:YES];
}
二 导航控制器的内部原理 【重点】
1.导航控制器内部维护者一个数组,这个数组里存放的是所有被管理的视图控制器,并且,这个数组以“栈”的方式来管理;
栈:是一种数据结构,特点:先进后出,后进先出;
2.push一个界面,对应的就是入栈操作;
3.pop一个界面,对应的就是出栈操作;
4.push进去vc,不会被释放,只有pop出去的vc才会被销毁;
5.不能pop根vc
三 导航栏 UINavigationBar
1)导航控制器所管理的视图控制器公用同一个导航栏;
2)每个视图控制器如果设置了导航栏的相关属性,那么其他的视图控制器界面上的导航栏会看到一样的效果;
3)
-
(void)viewDidLoad {
[super viewDidLoad];
/********** 导航栏相关设置 **********/
//iOS7.0之前,导航栏的高度是44
//iOS7.0之后,导航栏的高度波及到了状态栏(44+20 = 64);
//1.设置导航栏的样式
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;//2.设置导航栏是否透明
//YES 半透明 NO 不透明
self.navigationController.navigationBar.translucent = YES;//3.设置导航栏背景层的颜色【如果不透明,设置颜色无效】
self.navigationController.navigationBar.backgroundColor = [UIColor greenColor];//4.设置导航栏的颜色
// self.navigationController.navigationBar.barTintColor = [UIColor greenColor];//5.设置导航栏的背景图片 【重点】
//表示在竖屏下,显示“navBg.png”这张图片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];//在横屏下,显示“navBg-32.png”这张图片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg-32.png"] forBarMetrics:UIBarMetricsCompact];
//6.隐藏导航栏
self.navigationController.navigationBarHidden = YES ;
}
-(void)btnClick{
//创建vc2对象
ViewController2 *vc2 = [[ViewController2 alloc] init];
//push到vc2,由导航控制器来push
[self.navigationController pushViewController:vc2 animated:YES]; 【切换视图控制器】
}
四 UINavigationItem
每个视图控制器上的导航栏显示的item项是自己独立的,即每个视图控制器都可以设置自己的item项,其结构如下:
见【Demo】-【2-UINavigationItem】
UIBarButtonItem类型 【专门用于放在各种Bar上,和UIButton是不一样的】
有4种形式来创建UIBarButtonItem对象
1.以标题的形式创建
2.以系统自带的样式创建
3.以图片的形式来创建(对图片的大小有严格的要求)
4.以自定义的形式来创建 【最常用】
导航栏的标题分为两种形式:
1.title (self.title = @“”; <==> self.navigationItem.title = )
2.titleView 自定义标题视图
3.prompt 副标题
//设置导航栏的颜色
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
//************* 关于UINavigationItem的相关设置
//1.设置标题/Users/qianfeng/Desktop/6-图片2
// self.title = @"返回";
//2.设置标题视图
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 15, 15)];
titleLabel.text = @"页面一";
titleLabel.textColor = [UIColor redColor];
titleLabel.font = [UIFont systemFontOfSize:15];
titleLabel.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView = titleLabel; (titleView是UIView类型,所以可以添加UIView所有的子类)
//3.设置副标题
// self.navigationItem.prompt = @"副标题";
//********
//凡是navigationItem项都是UIBarButtonItem类型的对象
//1.通过标题的形式创建一个IBarButtonItem的对象
UIBarButtonItem *leftItem1 = [[UIBarButtonItem alloc] initWithTitle:@"item1" style:UIBarButtonItemStylePlain target:self action:@selector(leftItem1Click:)];
//2.通过系统自带的样式创建一个UIBarButtonItem对象
UIBarButtonItem *leftItem2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(leftItem2Click:)];
// self.navigationItem.leftBarButtonItem = leftItem1;
self.navigationItem.leftBarButtonItems = @[leftItem1,leftItem2];
//3.以自定义的样式,创建UIBarButtonItem对象 【*** 最常用 ***】
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 15, 15);
[btn setTitle:@"下一页" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightItem1 = [[UIBarButtonItem alloc] initWithCustomView:btn];
//4.以图片的形式创建UIBarButtonItem (对图片的大小要求很严格)
UIBarButtonItem *rightItem2 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"itemImage"] style:UIBarButtonItemStylePlain target:self action:@selector(rightItem2Click)];
self.navigationItem.rightBarButtonItems = @[rightItem1,rightItem2];
// self.navigationItem.rightBarButtonItem = rightItem1;
//设置下一级页面的返回item,应该在上一级设置 【注意】
//设置返回item
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backItem;
//********** 设置导航栏内容的渲染颜色
self.navigationController.navigationBar.tintColor = [UIColor redColor];
五 工具栏(UIToolBar) [了解]
每一个导航控制器自带了一个工具栏,是一个UIToolBar类型的对象,默认显示在底部(高度44),且默认是隐藏的!
//1.显示工具栏(所有页面公用同一个工具栏,但页面之间的item项不一样)
self.navigationController.toolbarHidden = NO;
//2.设置相关颜色
self.navigationController.toolbar.barTintColor = [UIColor brownColor];
//分割item
UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
self.toolbarItems = @[addItem,spaceItem,savaItem,spaceItem,editItem,spaceItem,searchItem];