iOS——UINavigationController

9 篇文章 0 订阅

思维导图:

页面跳转:
1.平级(切页)
2.覆盖{左右推,从下面推上去}
UINavigationController 实现左右推
上下推:模式

UINavigationController:导航控制器,是iOS中最常见的多视图控制器之一,它用来管理多个试图控制器。
导航控制器:管理控制器的控制器。
UINavigationController 继承于UIViewController,以栈的方式管理所控制的控制器,至少要有一个被管理的视图控制器,这个控制器我们称作,导航控制器的根视图控制器。
任何继承于UIViewController的类,都可以作为根视图控制器。

工作原理:
UINavigationController 通过栈的方式管理控制器的切换,控制入栈出栈来展示各个视图控制器
UINavigationController 的ContentView 里始终显示栈顶控制器的view
viewControllers 属性存储了栈中所有被管理的控制器
navigationController 属性,父类中的属性,每个在栈中的控制器,都能通过此属性,获取自己所在的UINavigationController对象。

导航控制器一个管理多个控制器
导航控制器一个,只是上面栏显示。其余空白。
下面是一个控制是视图的controller。导航条内容显示的栈顶的标题。

UIWindow上面-》
导航控制器的下面是contentView
所有被管理的控制器放在contentView 中。
栈顶视图控制器标题放在导航控制器标栏
栈顶控制器的视图放在contentView 中显示。

导航控制器是UIWindow的根视图控制器
子视图控制器是导航控制器的根视图控制器

  1. 设置导航控制器
AppDelegate.m文件中
//初始化 子视图控制器:loginVC
    LoginViewController * loginVC=[LoginViewController new];
 // 初始化导航控制器,并把其根视图控制器设置为子视图控制器:loginVC。
    UINavigationController * rootNC=[[UINavigationController alloc]initWithRootViewController:loginVC];
  // 设置UIWindow的根视图控制器为导航控制器
    self.window.rootViewController=rootNC;

2.实现跳转
1.)loginVC->registerVC->findPvdVC
可设置点击当前页面时跳转

LoginViewController.m 文件中

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//    1.创建新控制器
    RegisterViewController * registerVC=[RegisterViewController new];
//    2.使用导航控制器推出新控制器
//    self.navigationController 取出loginViewController 的navigation控制器
    [self.navigationController pushViewController:registerVC animated:YES];
//动画:两个页面都移动,会出现延迟 解决bug:设置背景色。
}
以后同理

2.)返回
按返回键返回或者方法实现返回

//  (1)回到根视图控制器,此时栈里面只有一个视图控制器。
//   [self.navigationController popToRootViewControllerAnimated:YES];
//  (2)回到上一个视图控制器
  [self.navigationController popViewControllerAnimated:YES];
//    通过viewControllers获得所有被管理的控制器,数组元素array[0]为loginVC,array[1]为registerVC,array[2]为findPassWardVC。
    NSArray *array= self.navigationController.viewControllers;
    NSLog(@"%@",array);

//   (3)回到指定的视图控制器
//    RegisterViewController * registerVC=self.navigationController.viewControllers[1];
//    [self.navigationController popToViewController:registerVC animated:YES];
    LoginViewController *loginVC=self.navigationController.viewControllers[0];
    [self.navigationController popToViewController:loginVC animated:YES];

//   (4)获取栈顶的视图器
    NSLog(@"%@",self.navigationController.topViewController);
    // push后的图片被模态遮挡后, 可见与栈顶就不是一个视图
//    获取可见的控制器,如果是横态的话,会是模态的视图。
    NSLog(@"%@",self.navigationController.visibleViewController);

3定制UINavigationBar
navigationBar—导航条iOS7之后默认是透明的,iOS7之前默认是不透明的
navigationBar在透明情况下,与contentView会重合一部分区域
navigationBar在不透明情况下,contentView跟在navigationBar的下面 navigationBar竖屏下默认高度是44,横屏下默认高度是32.

结构:
这里写图片描述

//   (1)barStyle
    rootNC.navigationBar.barStyle=UIBarStyleBlackTranslucent;
    rootNC.navigationBar.translucent=YES;
//    相当于下面(黑色,透明)
    rootNC.navigationBar.barStyle=UIBarStyleBlack;
//  默认
    rootNC.navigationBar.barStyle=UIBarStyleDefault;   

//  (2)是否透明:导航条iOS7 之后默认是透明的,之前默认是不透明的。横屏下默认高度是32,竖屏下默认高度是44.
//半透明,no为完全不透明,半透明时候,子视图控制器直接添加到contentView 上面,坐标(0,0),不透明时坐标是(0,64)
    rootNC.navigationBar.translucent=NO;

// (3) 两个按钮,一个标题都是item  设置item的渲染颜色
    rootNC.navigationBar.tintColor=[UIColor redColor];
// (4)设置导航条的渲染颜色
    rootNC.navigationBar.barTintColor=[UIColor grayColor];
//  (5)导航条隐藏,不能通过上面返回 ,系统的navigationBar不能显示出他范围之外的东西,可设置导航条隐藏,覆盖新的view。
   rootNC.navigationBarHidden=YES;

//  (6)UIBarMerticsCompact 设置横屏下导航的图片:注意图片尺寸问题
//    UIBarMetricsDefault 设置竖屏下导航的图片
   [rootNC.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar.png"] forBarMetrics:UIBarMetricsDefault];
   [rootNC.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar.png"] forBarMetrics:UIBarMetricsDefault];

4.管理UINavigationItem

UINavigationBar除了能定义自身的样式外,还管理一组UINavigationItem。
与UINavigationController相似,UINavigationBar也是以栈的方式管理一组UINavigationItem。提供push和pop操作item。
每个视图控制器都有一个navigationItem属性。navigationItem中设置的左右按钮,标题等,会随着控制器的显示,也显示到navigationBar上。


//每个视图控制器都有一个navigationItem的属性。所以下面两者不同
    NSLog(@"%@",self.navigationItem);
     NSLog(@"%@",self.self.navigationController.navigationItem);

//    1.设置中间文字标题
   self.navigationItem.title=@"登陆";

//   使用titleView 替换title。 titleView 是一个UIView
    UITextField * textField=[[UITextField alloc]initWithFrame:CGRectMake(0, 0, 100, 35)];
    self.navigationItem.titleView=textField;

//  2.添加左右按钮。 UIBarButtonItem父类UIBarItem ,父类是NSObject。使用add/target 模式
// 2.1 title
    self.navigationItem.leftBarButtonItem =[[UIBarButtonItem alloc]initWithTitle:@"按钮" style:UIBarButtonItemStyleDone target:self action:@selector(leftBarButtonAction:)];

//  2.2 图片image,需要注意镂空图
 self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"bar.png"]style:UIBarButtonItemStylePlain target:nil action:nil];

//  2.3 可以使用initWithCustom 来自定义UIView 按钮
    UISegmentedControl * segmented=[[UISegmentedControl alloc]initWithItems:@[@"男 ",@"女"]];
   // self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithCustomView:segmented];

//  2.4 UIBarButtonSystemItem 格式
    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil
                                           ];
//  2.5 设置多个UIBarButtonItem
    UIBarButtonItem *barbutton1=[[UIBarButtonItem alloc]initWithTitle:@"abd" style:UIBarButtonItemStyleDone target:nil action:nil];
      UIBarButtonItem *barbutton2=[[UIBarButtonItem alloc]initWithTitle:@"hhh" style:UIBarButtonItemStyleDone target:nil action:nil];
   self.navigationItem.rightBarButtonItems=[NSArray arrayWithObjects:barbutton1,barbutton2, nil];
 其中BarButtonSystemItem 属性
 self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值