第七章 UINavigationController
一、UINavigationController
1.UINavigationController:导航控制器,多视图控制器,管理多个视图控制器,称为管理控制器的控制器,主要管理有层次递进关系的控制器
2.UINavigationController:继承于UIViewController,以栈的方式管理所控制的视图控制器,至少要有一个被管理的视图控制器,这个控制器我们称为导航控制器的根视图控制器,任何继承自UIViewController的类(多态)都可以作为根视图控制器
//导航控制器的使用 ,导航控制器的初始化方式一般需要带根视图控制器,导航控制器是用来管理一组有序的视图控制器的视图控制器,他只负责管理视图控制器之间的切换,不负责内容的呈现。所以起码需要管理一个视图控制器。
//第一步:创建导航控制器的根视图控制器
ViewController* rootVC = [[ViewController alloc] init];
//第二步:
UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:rootVC];
//第三步:将导航控制器设置为window的根视图控制器
self.window.rootViewController = navigationController
二、UINavigationBar
1.UINavigationBar(导航栏):两部分,一为导航栏上的各种导航部件(UINavigationItem),二为导航栏自身的相关设置
2.navigationBar:导航条,iOS 7 之后默认是半透明的,之前是不透明的
3.navigationBar竖屏下默认高度为44,横屏默认高度为32,状态栏(statusBar)高度为20---iOS 7之后,navigationBar的背景会延伸到状态栏(statusBar)上,导航栏高为仍保持44,但显示效果为64
4.每个视图控制器都有一个navigationItem属性,navigationItem中设置左按钮、右按钮、标题等,会随着控制器的显示,也显示在navigationBar上
5.navigationItem的属性
1.设置标题
self.title = @"标题";---tong'shi'gai'bian'dao'hang'lan'de'biao'ti'he同时改变导航栏的标题和tabBar的标题
self.navigationItem.title = @"标题"---单独操作导航栏标题
2.设置左按钮、右按钮---间接继承与NSobject,不是按钮控件
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(leftAction)] autorelease];
3.创建UIBarButtonItem的初始化方法
1.initWithImage:style:target:action:---参数1:图片--参数2:barButtonStyle(按钮样式,枚举类型)--参数3;目标对象--参数4:方法
2.initWithTitle:style:target:action:---参数1:按钮文字--参数2:barButtonStyle(按钮样式,枚举类型)--参数3;目标对象--参数4:方法
3.initWithBarButtonSystemItem:target:action:---参数1:系统按钮样式(枚举)--参数2:目标对象--参数3:方法
4.initWithCustomView:---参数1;自定义UIView对象
4.左右item数组---self.navigationItem.leftBarButtonItems = @[item1, item2];
5.TitleView标题视图---titleView
self.navigationItem.titleView = segmentC;
6.导航栏的显隐属性---self.navigationController.navigationBarHidden = NO;
7.导航栏样式---self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
8.背景颜色---self.navigationController.navigationBar.backgroundColor = [UIColor redColor];
9.导航栏颜色---self.navigationController.navigationBar.barTintColor = [UIColor yellowColor];
10.导航栏元素颜色---self.navigationController.navigationBar.tintColor = [UIColor blackColor];
11.导航栏的半透明效果---默认开启YES
半透明效果开启时,屏幕左上角为坐标原点
半透明关闭时,导航栏左下角为坐标原点
self.navigationController.navigation Bar.translucent = YES;
三、页面跳转
1.工作原理:UINavigationController通过栈的方式管理控制器的切换,控制入栈(push)和出栈(pop)来展示各个视图控制器,
2.UINavigationController的ContentView里始终显示栈顶控制器的View。
3.viewControllers属性是一个可变数组(NSMutableArray)存储了栈中的所有被管理的控制器,入栈的时候,使用addObject把新的视图控制器对象添加到数组末尾,出栈时removeLastObject移除数组末尾的视图控制器对象。
4.navigationController属性,父类中的属性,每个在栈中的控制器,都能通过此属性,获取自己所在的UINavigationController对象
5.栈的特点:xian'ji先进后出,后进先出。栈顶为当前显示的视图控制器
6.常用属性
1.viewControllers:所有处于栈中的控制器,使用数组保存
2.topViewController:位于栈顶的控制器
3.visibleViewController:当前显示的控制器等同于topViewController模态控制器的原理
4.navigationBar;导航栏
5.navigationItem:导航栏控件
7.入栈和出栈的方法
1.pushViewController:animated:---进入下一个视图控制器
2.popViewControllerAnimated:---返回上一个视图控制器
3.popToViewController:animated:---返回指定的视图控制器
4.popToRootViewControllerAnimated:---返回根视图控制器
四、模态(modal)
1.进入下一页步骤
1.创建下一页对象
2.设置过渡动画(有默认值,可以不设置) ---modalTransitionStyle(枚举类型)
secVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
3.模态控制器---参数1:下一页对象--参数2:是否使用动画--参数:模态完成后执行的block(匿名函数;可以在方法内部作为属性使用,标志为倒三角)
[self presentViewController:secVC animated:YES completion:^{
}];
2.返回上一页
参数1:是否动画---参数2:返回完成后执行的block
[self dismissViewControllerAnimated:YES completion:^{
}];
3.页面切换方式对比
1.主要分为:推出(push)和模态(present)
2.推出(push0用于一系列的视图之间的跳转,有层次递进关系
3.模态(present)用于单独功能页面的跳转和主要业务逻辑没有关联(登录,歌曲播放页,系统相册,应用中调用系统功能)
扩展
1.MVC的应用场景:为导航栏添加按钮---MVC 的应用场景 C:navigationController V:Bar M:item
2.让图片保持原有,不被系统的颜色所渲染,我们就需要设置图片的渲染模式
UIImage* image = [[UIImage imageNamed:@"11.png"] imageWithRenderingMode:(UIImageRenderingModeAlwaysOriginal)];
3.视图出现的生命周期
1.加载视图---loadView
2.加载完毕---viewDidLoad
3.视图即将出现
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"%s",__FUNCTION__);
}
4.视图已经出现
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"%s",__FUNCTION__);
}
5.视图即将消失
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"%s",__FUNCTION__);
}
6.视图已经消失
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"%s",__FUNCTION__);
}
4.MRC和ARC下都可以使用dealloc方法,区别为:MRC:必须在方法的最后加[super dealloc];ARC:不能添加[super dealloc]
contentInsert:四个参数:上左下右
1.contentSize是UIScrollView可以滚动的区域。在我的理解中,我把UIScrollView看成是具有上下两层的一个复合视图,frame控制着上层的大小,我们看到的UIScrollView的大小实际就是frame的大小,上层固定不动,显示的变化,由下层的滚动来控制。而下层滚动的区域的大小,就是由contentSize来控制的了。例如:若frame = (0, 0, 320, 480) contentSize = (320, 960),代表本UIScrollView可以上下滚动,滚动区域为frame大小的两倍。
2.contentOffset是UIScrollView当前显示区域的顶点相对于frame顶点的偏移量,例如上面的例子如果拉到最下面,则contentOffset就是(0, 480),也就是y偏移了480.
3.contentInset的API文档的解释是"内容视图嵌入到封闭的滚动视图的距离"(哈,英文不是很好,翻译的不好)。可以理解为内容视图的上下左右四个边扩展出去的大小。contentInset的单位是UIEdgeInsets,默认值为UIEdgeInsetsZero,也就是没有扩展的边。下面解释一下UIEdgeInsets,它是一个结构体,定义如下:
typedef struct {
CGFloat top, left, bottom, right;
}
scrollsToTop:点击状态栏,返回顶部,默认为YES,不需要设置
SCrollView的tracking属性