美文网首页
4.6 UINavigationController

4.6 UINavigationController

作者: 草根小强 | 来源:发表于2019-04-12 11:54 被阅读0次

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.完成简易的人人客户端

相关文章

网友评论

      本文标题:4.6 UINavigationController

      本文链接:https://www.haomeiwen.com/subject/evzqwqtx.html