导航控制器的知识总结
1.导航控制器的功能和介绍
【注】导航控制器,是UIKit框架提供的一个容器视图控制器,用于切换拥有明确层次关系的视图。即由一级视图切换到二级视图,而不是平级视图间的切换。
【注】导航中视图控制器的层次结构,称为栈结构。
2.如何使用导航控制器实现界面之间的跳转
<1>显示一个界面,显示导航条
//使用导航控制器
//1.创建导航控制器,rvc放到导航控制器中
//2.导航控制器作为window根视图控制器
//导航条大小: 320X44
RootViewController *rvc = [[RootViewController alloc] init];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:rvc];
self.window.rootViewController = nc;
<2>使用导航控制器切换到另外一个界面
SecondViewController *svc = [[SecondViewController alloc] init];
[self.navigationController pushViewController:svc animated:YES];
<3>如何使用代码切换到上一个界面
//实现切换到上一个界面
[self.navigationController popViewControllerAnimated:YES];
<4>如何从任意视图控制器切换到根视图控制器
非常常用: 程序任意界面返回到登陆界面,返回应用主界面
//返回导航控制器中根视图控制器
[self.navigationController popToRootViewControllerAnimated:YES];
<5>如何导航控制器切换到任意的视图控制器
//如何利用导航控制器切换到第二个界面
//viewControllers存储者导航控制器中所有的视图控制器
NSArray *viewControllers = self.navigationController.viewControllers;
[self.navigationController popToViewController:[viewControllers objectAtIndex:1] animated:YES];
3.导航条上控件的设置
<1>设置标题(文字)
self.title = @"主界面";
//导航控制器的控件集合
self.navigationItem.title = @"main";
//细节1: 修改的都是标题,最后一个是有效的
<2>设置图片标题
//标题位置显示logo图片
//细节1: titleView优先级高,覆盖文本标题
//细节2: titleView是UIView,意味设置任意控件
//细节3: x和y忽略
//细节4: 图片显示不出来(1)名字 (2)必须设置大小
UIImageView *logoView = [[UIImageView alloc] init];
logoView.frame = CGRectMake(0, 0, 60, 35);
logoView.image = [UIImage imageNamed:@"logo_title.png"];
self.navigationItem.titleView = logoView;
[logoView release];
<3>左侧添加文本按钮
//<1>创建文本按钮
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithTitle:@"点我" style:UIBarButtonItemStyleDone target:self action:@selector(navButtonClick:)];
self.navigationItem.leftBarButtonItem = leftItem;
<4>左侧添加系统样式的按钮
//<2>.创建系统样式的按钮
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(navButtonClick:)];
self.navigationItem.leftBarButtonItem = leftItem;
<5>左侧添加自定义的按钮
//细节: 图片没有显示的问题,没有设置大小
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeCustom];
leftButton.frame = CGRectMake(0, 0, 33, 30);
[leftButton setBackgroundImage:[UIImage imageNamed:@"main_left_nav.png"] forState:UIControlStateNormal];
[leftButton addTarget:self action:@selector(navCustomButtonClick:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
self.navigationItem.leftBarButtonItem = leftItem;
<6>下个界面的左侧添加返回的按钮
//写在mainViewController
//细节1: 显示在下个界面上
//细节2: 忽略自定义ButtonItem的事件响应方法
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"返回主界面" style:UIBarButtonItemStyleDone target:self action:@selector(backButtonClick:)];
self.navigationItem.backBarButtonItem = backItem;
[backItem release];
4.导航条的设置(风格,背景图片,颜色)
<1>设置导航条的风格
//<1>设置风格(默认和黑色)
//<2> 不同的版本上会有不同: 两个枚举值放弃使用了
//细节: 设置透明后视图会上移
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
[self.navigationController.navigationBar setTranslucent:YES];
<2>颜色和色调
//<2>导航条颜色的设置
//颜色???
//细节1:混合色
//细节2: 只有设置为透明后才会出现
[self.navigationController.navigationBar setBackgroundColor:[UIColor redColor]];
//设置色调
[self.navigationController.navigationBar setTintColor:[UIColor redColor]];
<3>背景图片
//UIBarMetricsDefault表示横屏
//UIBarMetricsLandscapePhone竖屏
//细节: 图片格式适宜为 320X44
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"header_bg.png"] forBarMetrics:UIBarMetricsDefault];
<4>隐藏导航条
//隐藏导航栏
[self.navigationController setNavigationBarHidden:YES];
5.工具栏的使用(添加按钮)
<1>如何显示工具条
//细节: 导航控制器自带导航条和工具条
// 工具条默认情况下不会显示
[self.navigationController setToolbarHidden:NO];
<2>工具条上添加按钮
// 其中的对象应该是 UIBarButtonItem
//细节: 显示的从左边,按钮中没有间隔
UIBarButtonItem *one = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(toolButtonClick:)];
UIBarButtonItem *two = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(toolButtonClick:)];
UIBarButtonItem *three = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(toolButtonClick:)];
//间隔也是UIBarButtonItem
UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
self.toolbarItems = [NSArray arrayWithObjects:one,space,two,space,three,nil];
<3>指定按钮的位置
UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
space.width = 60;
6.导航控制器的界面传值 (单例传值)
<1>正向传值
ImageCategoryViewController *icvc = [[ImageCategoryViewController alloc] init];
icvc.username = @"long ao tian";
icvc.delegate = self;
[self.navigationController pushViewController:icvc animated:YES];
<2>反向传值 !!!
//思路:
//思考1: 当前视图控制器有没有main指针
// <1>当前视图控制器加属性 delegate
// <2>切换到当前界面的是设置 delegate
//delegate一半都是id类型
//思考: 能不能给他发送消息
// 发送后delegate没有方法响应这个消息
// <1>自己要指定一个协议
// <2>对方遵守协议,实现协议中方法
//细节: Image制定协议, 别人遵守
7.扩展: 好玩界面间的切换效果
//@"cube" @"moveIn" @"reveal" @"fade"(default) @"pageCurl" @"pageUnCurl" @"suckEffect" @"rippleEffect" @"oglFlip"
//加上切换效果, 扩展内容
// QuartzCore 实现动画
//1.包含头文件
//2.导入库二进制文件Library
//<1>创建对象
CATransition *animation = [CATransition animation];
//设置动画类型
// //@"cube" @"moveIn" @"reveal" @"fade"(default) @"pageCurl" @"pageUnCurl" @"suckEffect" @"rippleEffect" @"oglFlip"
animation.type = @"fade";
//设置动画的方向
animation.subtype = kCATransitionFromTop;
//设置动画时间.0.5秒
animation.duration = 3;
//设置动画的节奏
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
//animation加入到导航控制器中
[self.navigationController.view.layer addAnimation:animation forKey:nil];
[self.navigationController pushViewController:icvc animated:YES];
8. //设置naviagtionbar的返回按钮颜色
// self.navigationController.navigationBar.barTintColor = [UIColor blackColor]; self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];