导航控制器 UINavigationController : 本质上就是一个控制器,可以直接作为主窗口(根Window)的控制器,其他的控制器通过添加到导航控制器上来实现功能
//此时导航控制器的界面是整个主窗口,并且在最顶上有一个类似表头的框
-
一、子控制器添加到导航控制器 add、push、.viewControllers的区别 :
add: (一个一个添加,会覆盖) ,后面的控制器会不停的覆盖前面的控制器,最后只能添加一个控制器//
push(一个一个添加,不会覆盖) ,并且可以设置动画效果
效果: 会闪(因为动画效果),按顺序添加所有控制器,Window显示最后一个控制器,并且自动提供返回按钮
如果modal跳转控制器不强引用,控制器就会消失,造成坏内存错误
. viewControllers(一次性添加多个,不会覆盖)
-
二、通过storyboard创建UINavigationController导航控制器
首先设置根控制器 : 添加控制器(ViewController) - 1.右击navigation 2.选root 3.连线到新控制器
按钮 实现连线下一个控制器 : 选择按钮右击-action-show(push也是能用,但是目前已经弃用了)
//注意 : 此处show 和push的区别 ,push自动添加了navigationItem ,show需要手动添加
//此时navigationItem有3个属性,标题,副标题,返回该控制器按钮的名称
如果 ,将控制器连线到指定的控制器,会造成循环,没有pop,要实现pop必须要纯代码
-
三、导航控制器对子控制器的管理
规范 : 首先给导航控制器设置一个根控制器 ,这个控制器在导航控制器的创建阶段就可以设置 alloc init方法
添加 :
跳转到下一个控制器的原理 : 增加下一个控制器 / 在对应控制器的.m文件中实现
实现步骤: 给当前对象的导航控制器添加控制器 , 如何获取导航控制器 - self.navigationController
返回 :
手动返回上一个控制器, 原理 :直接删除当前控制器 pop
手动返回到根控制器, 原理 :直接删除中间所有的控制器 pop
手动返回到指定控制器, 原理 :也是删除,pop,直接删除到
self.navigationController.viewControllers[x]
-
四、设置导航栏内容及常用属性
当前控制器 : 就是栈顶控制器
栈顶控制器的导航栏内容,由栈顶控制器的navigationItem决定
navigationItem.title 标题 设置了标题等于间接的设置了返回这个控制器按钮的按钮名称
navigationItem.leftBarButtonItem 左按钮 设置了左按钮跟返回按钮重叠,会覆盖返回按钮
navigationItem.backBarButtonItem 返回按钮 创建返回按钮可以设置title ,如果不绑定方法,就会调用系统的返回方法,返回上一级
1.hidesBarsOnSwipe属性: 滑动自动隐藏状态栏
2.获取栈顶控制器的导航栏 :(在纯代码中也能用viewControllers属性获取子控制器)
navVc.topViewController.navigationItem
3.给navigationItem添加图片按钮
UIImage *new = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem *btn = [[UIBarButtonItem alloc]initWithImage:new style:0 target:self action:@selector(click:)];
self.navigationItem.leftBarButtonItem = btn;
设置返回按钮
UIBarButtonItem *backbtn = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
[self.navigationItem setBackBarButtonItem:backbtn];
4.给控制器添加子控制器storyboard(通过storyboard创建控制器)
两个步骤 :
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"copy1" bundle:nil];
UINavigationController *navigation = [storyBoard instantiateInitialViewController];//初始化navigationController
添加子控制器
self.viewControllers = @[navigation1,navigation2,navigation3,navigation4,navigation5];
//用addchildController会跟自定义tabBar冲突
//子控制器间的跳转需要纯代码 :
5.设置导航栏背景颜色 :
[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
设置导航栏标题,必须通过栈顶控制器的navigationItem 设置 MyHallController.navigationItem.title = @"标题";
6.设置导航标题栏渲染色和标题字体色是不一样的:
//设置 导航栏的标题的颜色
NSDictionary *attrs = @{
NSForegroundColorAttributeName :[UIColor whiteColor]
};
[self.navigationBar setTitleTextAttributes:attrs];
//设置渲染色
[self.navigationBar setTintColor:[UIColor whiteColor]];
7.设置导航条的透明度根据滚动渐变
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
UIColor * color = [UIColor colorWithRed:0/255.0 green:175/255.0 blue:240/255.0 alpha:1];
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY > NAVBAR_CHANGE_POINT) {
CGFloat alpha = MIN(1, 1 - ((NAVBAR_CHANGE_POINT + 64 - offsetY) / 64));
[self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:alpha]];
} else {
[self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:0]];
}
}