4.6 UINavigationController
UINavigationController
UINavigationController: 【本身不显示】
1.根视图控制器
2.压入视图控制器,弹出视图控制器
3.栈结构,获取栈中视图控制器
UINavigationBar:【是属于UINavigationController的】
1.barStyle、是否透明、bar颜色、镂空颜色
2.设置背景图片、△设置隐藏
UINavigationItem:【是属于各自的视图控制器的】
1.备注、标题
2.标题视图
3.左右Item,下一级页面返回按钮
【什么是导航控制器】
导航控制器,是UIKit框架提供的容器视图控制器,用于切换具有明确层次关系的视图控制器。是纵向视图的切换,而不是横向视图的切换。
【导航控制器的结构】
导航控制器维护一个视图控制器栈,任何类型的视图控制器都可以放入栈中。导航控制器中视图控制器的层次,是栈结构。
1.管理的内容是有序的
2.先进后出
一、基本视图切换
#pragma mark - 创建导航控制器
- (void)createNavigationController {
LNBFirstViewController * first = [[LNBFirstViewController alloc] init];
UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:first];
self.window.rootViewController = nav;
[first release];
[nav release];
}
#pragma mark - 点击切换视图控制器 - 压入
- (void)buttonClicked:(UIButton *)button {
LNBSecondViewController * second = [[LNBSecondViewController alloc] init];
//通过导航控制器压入第二级页面
[self.navigationController pushViewController:second animated:YES];
[second release];
}
#pragma mark - 点击切换视图控制器 - 推出
- (void)buttonClicked:(UIButton *)button {
//返回上一级视图控制器
[self.navigationController popViewControllerAnimated:YES];
//返回同一导航控制器下的根视图控制器
[self.navigationController popToRootViewControllerAnimated:YES];
//返回栈中的任意视图控制器
//1.找到栈中的所有的视图控制器
NSArray * vcArray = self.navigationController.viewControllers;
//2.跳转到指定控制器
[self.navigationController popToViewController:vcArray[0] animated:YES];
}
二、导航控制器的定制
【注】导航控制器包含三个类,他们共同起作用
(1)UINavigationController 它本身不显示,不需定制
(2)UINavigationBar 属于导航控制器,是它的子对象,需要统一定制
(3)UINavigationItem 在导航条上显示的元素,它归属于导航控制器中的视图控制器,每个视图控制器有自己的UINavigationItem,需要每个视图控制器单独定制
【例】出租小饭馆,换个店主,换个牌,但是匾不许要换
1.制定导航条(UINavigationBar)
//定制UINavigationBar
- (void)formulateNavigationBar {
UINavigationController * nav = (id)self.window.rootViewController;
//设置导航条样式
nav.navigationBar.barStyle = UIBarStyleBlack;
//UIBarStyleDefault
//UIBarStyleBlack
//设置导航条是否透明
nav.navigationBar.translucent = NO;
//设置导航条的颜色
nav.navigationBar.barTintColor = [UIColor redColor];
//设置镂空颜色
nav.navigationBar.tintColor = [UIColor orangeColor];
//设置导航条的图片
//图片名字为rr_main_background.png, 如果用户的设备为retina屏, 会自动加载rr_main_background@2x.png
[nav.navigationBar setBackgroundImage:[UIImage imageNamed:@"header_bg64.png"] forBarMetrics:UIBarMetricsDefault];
//UIBarMetricsDefault, //纵屏
//UIBarMetricsCompact, //横屏
//UIBarMetricsDefaultPrompt, //纵屏带备注
//UIBarMetricsCompactPrompt, //横屏带备注
//如果设置的图片正好是44像素高度,retina屏为88,那么图片会放在状态栏下面
//如果添加的是64、128高度的图片,会置顶
//只要不是44高度,都会置顶
//设置导航条隐藏
[nav setNavigationBarHidden:YES animated:YES];
}
2.定制导航条元素(UINavigationItem)
【总结】
1.导航条元素分为三个区域,左中右
2.导航条元素左、右区域,可以设置多个按钮
△3.左右区域按钮定制方式
(1)用官方样式定制
(2)用纯文本定制
(3)用图片定制
(4)用任意自定制视图定制按钮
//用官方样板定制UINavigationItem
- (void)formulateNavigationItem {
//添加导航条备注
self.navigationItem.prompt = @"这是第一级";
//设置navigationItem标题,优先级高于self.title
self.navigationItem.title = @"abc";
//添加标题视图
UISlider * slider = [[UISlider alloc] initWithFrame:CGRectMake(100, 0, 200, 30)];
self.navigationItem.titleView = slider;
[slider release];
//△定制左右按钮
//官方样式
UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(buttonClicked:)];
//用文字创建
UIBarButtonItem * item1 = [[UIBarButtonItem alloc] initWithTitle:@"帅哥" style:UIBarButtonItemStyleDone target:self action:@selector(buttonClicked:)];
self.navigationItem.rightBarButtonItems = @[item, item1];
[item release];
[item1 release];
//用图片创建
//设置图片永远显示原色
UIImage * image = [[UIImage imageNamed:@"DOVE 1.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem * item2 = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStyleDone target:self action:nil];
self.navigationItem.leftBarButtonItem = item2;
[item2 release];
}
//用任意视图定制UINavigationItem
- (void)formulateNavigationItem {
UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 120, 20)];
[button setTitle:@"大帅哥" forState:UIControlStateNormal];
UIButton * button1 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[button1 setImage:[UIImage imageNamed:@"DOVE 1.png"] forState:UIControlStateNormal];
//用任意视图创建UINavigationItem
UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.rightBarButtonItem = item;
UIBarButtonItem * item1 = [[UIBarButtonItem alloc] initWithCustomView:button1];
self.navigationItem.leftBarButtonItem = item1;
[button1 release];
[item1 release];
[button release];
[item release];
}
//特殊的一点
- (void)formulateNavigationItem {
//在本级页设置下一级页面的返回按钮, 无需添加target和action, 因为是固定的, 就是为了返回
UIBarButtonItem * item_back = [[UIBarButtonItem alloc] initWithTitle:@"我是大帅哥" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = item_back;
[item_back release];
}
3.定制工具条(ToolBar)
//每个导航控制器还配备了一个工具条,默认隐藏
【注】ToolBar属于导航控制器,只有一个,需要统一定制
【注】ToolBar上的元素ToolBarItem属于每个视图控制器,需要每个视图控制器单独定制
//定制ToolBar样式
- (void)formulateToolBar {
//设置样式
//设置是否透明(ToolBar中的是否透明不会影响坐标系)
self.navigationController.toolbar.translucent = NO;
//设置样式(黑/白)
self.navigationController.toolbar.barStyle = UIBarStyleBlack;
//设置文字、图标颜色
self.navigationController.toolbar.tintColor = [UIColor redColor];
//设置ToolBar的色调
self.navigationController.toolbar.barTintColor = [UIColor whiteColor];
//设置图片
[self.navigationController.toolbar setBackgroundImage:[UIImage imageNamed:@"rr_homepage_bg_notify.png"] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
}
//定制ToolBarItems
- (void)formulateToolBarItems {
UIBarButtonItem * item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:nil action:nil];
UIBarButtonItem * item2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];
UIBarButtonItem * item3 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
//占位符, 占位符允许多次使用,其他item不可以
//UIBarButtonSystemItemFlexibleSpace, //等分占位符
//UIBarButtonSystemItemFixedSpace, //宽度自定义
UIBarButtonItem * space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem * space1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
space1.width = 40;
//ToolBarItems属于每个视图控制器
self.toolbarItems = @[item1, space1, item2, space1, item3];
[item1 release];
[item2 release];
[item3 release];
}
作业:
1.写一个具有两条线路的应用
(1)设置 —> 通用 —> 关于本机
(2)设置 —> 隐私 —> 位置
2.完成简易的人人客户端