美文网首页
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