导航控制器 UINavigationController

导航控制器 UINavigationController : 本质上就是一个控制器,可以直接作为主窗口(根Window)的控制器,其他的控制器通过添加到导航控制器上来实现功能
//此时导航控制器的界面是整个主窗口,并且在最顶上有一个类似表头的框

  • 一、子控制器添加到导航控制器 add、push、.viewControllers的区别 :

add: (一个一个添加,会覆盖) ,后面的控制器会不停的覆盖前面的控制器,最后只能添加一个控制器//

push(一个一个添加,不会覆盖) ,并且可以设置动画效果
效果: 会闪(因为动画效果),按顺序添加所有控制器,Window显示最后一个控制器,并且自动提供返回按钮
如果modal跳转控制器不强引用,控制器就会消失,造成坏内存错误

. viewControllers(一次性添加多个,不会覆盖)

  • 二、通过storyboard创建UINavigationController导航控制器

首先设置根控制器 : 添加控制器(ViewController) - 1.右击navigation 2.选root 3.连线到新控制器

按钮 实现连线下一个控制器 : 选择按钮右击-action-show(push也是能用,但是目前已经弃用了)
//注意 : 此处show 和push的区别 ,push自动添加了navigationItem ,show需要手动添加

//此时navigationItem有3个属性,标题,副标题,返回该控制器按钮的名称

如果 ,将控制器连线到指定的控制器,会造成循环,没有pop,要实现pop必须要纯代码

  • 三、导航控制器对子控制器的管理

规范 : 首先给导航控制器设置一个根控制器 ,这个控制器在导航控制器的创建阶段就可以设置 alloc init方法

添加 :
跳转到下一个控制器的原理 : 增加下一个控制器 / 在对应控制器的.m文件中实现
实现步骤: 给当前对象的导航控制器添加控制器 , 如何获取导航控制器 - self.navigationController

返回 :
手动返回上一个控制器, 原理 :直接删除当前控制器 pop
手动返回到根控制器, 原理 :直接删除中间所有的控制器 pop
手动返回到指定控制器, 原理 :也是删除,pop,直接删除到

self.navigationController.viewControllers[x]
  • 四、设置导航栏内容及常用属性

当前控制器 : 就是栈顶控制器

栈顶控制器的导航栏内容,由栈顶控制器的navigationItem决定
navigationItem.title 标题 设置了标题等于间接的设置了返回这个控制器按钮的按钮名称
navigationItem.leftBarButtonItem 左按钮 设置了左按钮跟返回按钮重叠,会覆盖返回按钮
navigationItem.backBarButtonItem 返回按钮 创建返回按钮可以设置title ,如果不绑定方法,就会调用系统的返回方法,返回上一级

1.hidesBarsOnSwipe属性: 滑动自动隐藏状态栏

2.获取栈顶控制器的导航栏 :(在纯代码中也能用viewControllers属性获取子控制器)

navVc.topViewController.navigationItem

3.给navigationItem添加图片按钮

    UIImage *new = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIBarButtonItem *btn = [[UIBarButtonItem alloc]initWithImage:new style:0 target:self action:@selector(click:)];
    self.navigationItem.leftBarButtonItem = btn;
设置返回按钮
    UIBarButtonItem *backbtn = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
    [self.navigationItem setBackBarButtonItem:backbtn];

4.给控制器添加子控制器storyboard(通过storyboard创建控制器)

两个步骤 :
 UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"copy1" bundle:nil];
 UINavigationController *navigation = [storyBoard instantiateInitialViewController];//初始化navigationController
 添加子控制器
  self.viewControllers = @[navigation1,navigation2,navigation3,navigation4,navigation5];
 //用addchildController会跟自定义tabBar冲突
 //子控制器间的跳转需要纯代码 :    

5.设置导航栏背景颜色 :

[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
设置导航栏标题,必须通过栈顶控制器的navigationItem 设置  MyHallController.navigationItem.title = @"标题";

6.设置导航标题栏渲染色和标题字体色是不一样的:

//设置 导航栏的标题的颜色
    NSDictionary *attrs = @{
                            NSForegroundColorAttributeName :[UIColor whiteColor]  
                            };
    [self.navigationBar setTitleTextAttributes:attrs];
//设置渲染色
    [self.navigationBar setTintColor:[UIColor whiteColor]];

7.设置导航条的透明度根据滚动渐变

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

 UIColor * color = [UIColor colorWithRed:0/255.0 green:175/255.0 blue:240/255.0 alpha:1];
    CGFloat offsetY = scrollView.contentOffset.y;
    if (offsetY > NAVBAR_CHANGE_POINT) {
        CGFloat alpha = MIN(1, 1 - ((NAVBAR_CHANGE_POINT + 64 - offsetY) / 64));
        [self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:alpha]];
        
    } else {
        [self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:0]];
    }
}

你可能感兴趣的:(导航控制器 UINavigationController)