导航控制器

UINavigationController

【导航控制器】

首先需要在代理AppDelegate.m里边做设置

    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];

    ViewController *vc = [[ViewController alloc]init];

    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];

    self.window.rootViewController = nav;

    [self.window makeKeyAndVisible];

可以统一设置导航视图控制器

//    设置title颜色,这个方法的参数是个字典

//    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],NSForegroundColorAttributeName, nil];

//   

//    //统一设置 导航视图控制器的颜色(多个导航视图控制器)

//    [[UINavigationBar appearance] setTitleTextAttributes:dict];

UINavigationController是导航控制器,是一个容器视图控制器,用于切换具有层次关系的视图,而非同一级视图间的切换。

1、视图控制器之间的切换

        a、向导航控制器压入一个新的视图控制器

                [self.navigationController pushViewController:svc animated:YES];

        b、从导航控制器弹出最顶层的视图控制器(上一级)

                [self.navigationController popViewControllerAnimated:YES];

        c、从导航控制器弹出到指定的视图控制器

    先从数组里边找到视图控制器

                [self.navigationController popToViewController:controllers[1] animated:YES];

        d、从导航控制器弹出到根视图控制器

                [self.navigationController popToRootViewControllerAnimated:YES];

2、定制UINavigationBar

        a、是否半透明

                bar.translucent = NO;

        b、设置背景图片

                [bar setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];

        c、设置导航条风格,会影响状态栏的黑白显示

                bar.barStyle = UIBarStyleDefault;

        d、设置背景色,测试时不要设置背景图

                //iOS7.0之后设置背景色

                bar.barTintColor = [UIColor whiteColor];

                //iOS7.0之前设置背景色,7.0之后用于设置返回按钮的颜色

                bar.tintColor = [UIColor blackColor];

        e、隐藏 / 显示导航栏

                [self.navigationController setNavigationBarHidden:NO animated:YES];

    //导航条的高度64

    //状态栏 20

    //导航条的颜色默认是半透明(毛玻璃)效果,这个时候视图控制器的原点坐标是 屏幕的左上角。如果去掉毛玻璃效果,原点坐标是从导航栏下边开始

    self.navigationController.navigationBar.translucent = NO;

    //同一层次的导航控制子视图,他们只有一个navigationBar

    //设置导航条颜色

    self.navigationController.navigationBar.barTintColor = [UIColor cyanColor];

    //返回按钮的颜色(镂空颜色)

    self.navigationController.navigationBar.tintColor = [UIColor blueColor];

    

    //设置title颜色,这个方法的参数是个字典

//    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],NSForegroundColorAttributeName, nil];

//    [self.navigationController.navigationBar setTitleTextAttributes:dict];

    

    //统一设置 导航导航视图控制器的颜色(多个导航视图控制器)

   // [[UINavigationBar appearance] setTitleTextAttributes:dict];

   

   //设置navigation背景图片

//    UIBarMetricsDefault,普通模式也叫人像模式,竖屏

//    UIBarMetricsCompact,风景模式,横屏

    //如果只设置了竖屏下的背景图片,横屏也默认这个背景图片

    //如果图片高度为64的话,导航栏样式就是iOS7之后的融合样式

//    UIImage *image64 = [UIImage imageNamed:@"header_bg64"];

//    [self.navigationController.navigationBar setBackgroundImage:image64 forBarMetrics:UIBarMetricsDefault];

    

    //高度44 ,导航栏是跟状态栏分开的

   // UIImage *image44 = [UIImage imageNamed:@"header_bg"];

   

    //高度是42,宽度是10像素,这个时候平铺了图片

    //只要不是44或者64,都会充满64像素去平铺

//    UIImage *image42 = [UIImage imageNamed:@"bg_navigationBar"];

//    [self.navigationController.navigationBar setBackgroundImage:image42 forBarMetrics:UIBarMetricsDefault];

   

//导航条的样式

//    UIBarStyleDefault          = 0,

//    UIBarStyleBlack            = 1,

//    

//    UIBarStyleBlackOpaque      = 1, // Deprecated. Use UIBarStyleBlack

//    UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES

    [self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

    

//隐藏/显示导航栏

    //[self.navigationController setNavigationBarHidden:YES];

3、定制UINavigationItem

        返回按钮的定制原则:

        a、若当前页设置了leftBarButtonItem(s),则优先显示自己定制的

        b、若没有设置leftBarButtonItem(s),则要看上一页的title

                backBarButtonItem,其中后者优先但是不建议使用

        c、设置title的方式有两种self.titleself.navigationItem.title

                它们两个其实是设置的同一个,最后设置的有效。

  //找到NavigationItem

    UINavigationItem *item = self.navigationItem;

    item.title = @"第二个";

    //self.title 与 item.title都能设置导航栏的标题,但是最后设置的有效

    //titleView 标题视图

    UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];

    view1.backgroundColor = [UIColor redColor];

    item.titleView = view1;

    //item只对本视图控制器有效

    

    //第一个参数 创建一个系统风格的item

    //第二个参数 事件接受者

    //第三个参数 事件

    UIBarButtonItem *baritem1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(baritem1Pressed:)];

    //设置右边的item

    item.rightBarButtonItem = baritem1;

    

    UIBarButtonItem *baritem2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(baritem2Pressed:)];

    //设置左边的item

   // item.leftBarButtonItem = baritem2;

    UIBarButtonItem *baritem3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(baritem3Pressed:)];

  

   //用文字设置BarButtonItem

//    UIBarButtonItemStylePlain,

//    UIBarButtonItemStyleBordered NS_ENUM_DEPRECATED_IOS(2_0, 8_0, "Use UIBarButtonItemStylePlain when minimum deployment target is iOS7 or later"),

//    UIBarButtonItemStyleDone,

    UIBarButtonItem *textItem = [[UIBarButtonItem alloc]initWithTitle:@"确定" style:UIBarButtonItemStylePlain target:self action:nil];

   

    //用图片创建item

    UIImage *image = [UIImage imageNamed:@"btn_feedCell_collection_selected"];

    //用图片的最原始模式

    UIBarButtonItem *imageItem = [[UIBarButtonItem alloc]initWithImage:[image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:nil];

   

    //用视图创建

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    [btn setImage:[UIImage imageNamed:@"btn_increase"] forState:UIControlStateNormal];

    btn.frame = CGRectMake(0, 0, 40, 40);

    [btn addTarget:self action:@selector(btnItemPressed:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *viewItem = [[UIBarButtonItem alloc]initWithCustomView:btn];

    

    //用数组来设置item

    item.leftBarButtonItems = @[baritem2,baritem3,textItem,imageItem,viewItem];

    

    //定制返回按钮

    UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil];

    item.backBarButtonItem = backItem;

4、图片的拉伸

   UIImage *image = [UIImage imageNamed:@"Pasted Graphic.tiff"];

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 270, 150)];

    //UIEdgeInsets也是一个结构体 上左下右,就是离四条边的距离

    //指定cap到边的部分不会不会被拉伸,其余部分会拉伸,尤其是要注意的是,拉伸的时候是从左到右,从上到下,通俗点说,拉伸不是全方向的拉伸,而是(先)垂直和(后)水平叠加。

    image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(20, 100, 10, 10)];

    imageView.image = image;

    [self.view addSubview:imageView];

/**

 *  自定义返回按钮

 */

- (void)customBackItem {

    //btn_navigationBar_back

    UIImage *image = [UIImage imageNamed:@"btn_navigationBar_back"];

     //第一种风格的返回按钮 文字和箭头

    UIBarButtonItem *item = [[UIBarButtonItem alloc]init];

    [item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    self.navigationItem.backBarButtonItem = item;

    

     //第一种风格的返回按钮 箭头

//    UIBarButtonItem *item = [[UIBarButtonItem alloc]init];

//    [item setBackButtonBackgroundImage:[image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

//    //设置返回按钮的文字不显示

//    [item setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics: UIBarMetricsDefault];

//    

//    self.navigationItem.backBarButtonItem = item;

}

4、定制UIToolbar

        a、背景色以及背景图

        b、定制toolbarItems

/**

 *  自定义toolbar,每个在导航控制器只有一个toolbar,但是上面的item需要定制

 */

- (void)customToolBar {

    [self.navigationController setToolbarHidden:NO];

    UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];

    UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:nil action:nil];

     //自动挤压两边的item,也是用来占位的

//    UIBarButtonSystemItemFlexibleSpace,

    //固定宽度,不显示,用来占位的

//    UIBarButtonSystemItemFixedSpace,

    UIBarButtonItem *itemSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];

    itemSpace.width = 100;

    self.toolbarItems = @[item,itemSpace,item1];

}

界面将来消失,下一个界面不显示ToolBar

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    //隐藏toolbar

    [self.navigationController setToolbarHidden:YES animated:YES];

}

已经显示过的界面,保证再次出现任有ToolBar

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    [self.navigationController setToolbarHidden:NO animated:YES];

}

原文地址:https://www.cnblogs.com/jiang-xiao-yan/p/5952492.html