UINavigationController

⼀、UINavigationController
 
  • UINavigationController:导航控制器,是iOS中最常⽤的多视图 控制器之⼀,⽤它来管理多个视图控制器。 
  • 导航控制器可以称为是,管理控制器的控制器,主要管理有层 次递进关系的控制器。
  • UINavigationController继承于UIViewController,以栈的⽅式管 理所控制的视图控制器,⾄少要有⼀个被管理的视图控制器, 这个控制器我们称作,导航控制器的根视图控制器。
  • 任何继承⾃UIViewController的类(多态)都可以作为根控制器。
 
//导航视图控制器也是一个视图控制器,TA管理了多个子视图控制器,是系统提供给我们的容器视图控制器
    //导航视图控制器至少管理了一个子视图控制器,这个视图控制器称为导航视图控制器的根视图控制器
    //如果我们的程序想要采用导航视图控制器进行布局,我们需要指定window的根视图控制器为导航视图控制器
 
// 创建根视图器的根视图控制器
    RootViewController *rootVC = [[RootViewController alloc] init];
    // 创建导航控制器 把rootVC作为导航控制
    UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:rootVC];
    //设置导航栏的显隐属性
//    naVC.navigationBarHidden = YES;
 
    //设置导航栏样式
    naVC.navigationBar.barStyle = UIBarStyleDefault;
   
    //设置导航条的背景颜色
    naVC.navigationBar.backgroundColor = [UIColor lightGrayColor];
   
    //设置导航栏颜色
    naVC.navigationBar.barTintColor = [UIColor lightGrayColor];
   
    //设置导航栏元素颜色
    naVC.navigationBar.tintColor = [UIColor cyanColor];
    // 设置导航为window的根视图
    self.window.rootViewController = naVC;
    // 内存管理
    [naVC release];
    [rootVC release];
 
⼆、UINavigationBar
 
  • UINavigationBar(导航栏)上的设置主要分两部分,⼀为导航栏上的 各种导航部件(UINavigationItem),⼆为导航栏⾃⾝的相关设置。 
  • navigationBar—导航条,iOS7之后默认是半透明的,iOS7之前默认 是不透明的。 
  • navigationBar竖屏下默认⾼度44,横屏下默认⾼度32。 
  • iOS7之后,navigationBar的背景会延伸到statusBar上。导航栏⾼ 度仍保持44,但显⽰效果为64。
  • 每个视图控制器都有⼀个navigationItem属性。navigationItem中 设置的左按钮、右按钮、标题等,会随着控制器的显⽰,也显⽰ 到navigationBar上。
 
self.view.backgroundColor = [UIColor whiteColor];
   
    //每一个加到导航视图控制器内部的视图控制器自带一个属性叫navigationItem,可以配置当前页面导航条的显示内容,比如左、右按钮,标题等
    self.navigationItem.title = @"中二洪荒";
 
//创建左按钮
     //1 显示标题
    UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithTitle:@"巴达" style:UIBarButtonItemStylePlain target:self action:@selector(leftAction)];
   
     //2 使用系统自带图标样式
    UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(leftAction)];
   
    // 3 使用自定义图片显示
    UIImage *image = [UIImage imageNamed:@"dianhua"];
   
    UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(leftAction)];

    //指定左按钮
    self.navigationItem.leftBarButtonItem = left;
   
    // 4 使用自定义视图显示
    UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
   
    UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithCustomView:mySwitch];
    self.navigationItem.leftBarButtonItem = left;
   
    [mySwitch release];
    [left release];
   
    //设置左、右按钮显示多个
    UIBarButtonItem *first = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add)];
    UIBarButtonItem *second = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(bookmark)];
    self.navigationItem.rightBarButtonItems = @[first, second];
    [first release];
    [second release];
``````````````````````````````````````````````````````````````````
//设置导航条上的标题视图
    UISegmentedControl *seg = [[UISegmentedControl alloc] initWithItems:@[@"中二洪荒", @"洪荒中二"]];
    seg.selectedSegmentIndex = 0;
//    seg.momentary = YES;
    self.navigationItem.titleView = seg;
    [seg release];
 
// 导航栏半透明效果(iOS7以后 默认为YES)
    // 当半透明效果开启时 屏幕左上角为坐标原点
    // 关闭时 导航栏左下角为坐标原点
    self.navigationController.navigationBar.translucent = NO;
 
```````````````````````````````````````````````````````````````````````
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(125, 100, 100, 100)];
    view.tag = 101;
    view.backgroundColor = [UIColor blackColor];
    [self.view addSubview:view];
    [view release];
   
    UIStepper *stepper = [[UIStepper alloc] initWithFrame:CGRectMake(100, 300, 100, 40)];
    stepper.minimumValue = 1;
    stepper.maximumValue = 5;
    stepper.stepValue = 1;
    [stepper addTarget:self action:@selector(step:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:stepper];
    [stepper release];
 
 
- (void)step:(UIStepper *)stepper {
    UIView *view = [self.view viewWithTag:101];
    view.bounds = CGRectMake(0, 0, 100 + 50 * stepper.value, 100 + 50 * stepper.value);
}
 
三、页⾯跳转
 
  • UINavigationController通过栈的⽅式管理控制器的切换,控制⼊栈和出栈 来展⽰各个视图控制器。 
  • UINavigationController的ContentView⾥始终显⽰栈顶控制器的view. 
  • viewControllers属性是⼀个可变数组(NSMutableArray)存储了栈中的所有 被管理的控制器,⼊栈的时候,使⽤addObject把新的视图控制器对象添加 到数组末尾,出栈时removeLastObject移除数组末尾的试图控制器对象。 
  • navigationController属性,⽗类中的属性,每个在栈中的控制器,都能通 过此属性,获取⾃⼰所在的UINavigationController对象。
 
常用属性:
//点击按钮实现推出视图控制器的操作
- (void)push {
    //1、创建想要跳转到的视图控制器
    SecondViewController *secondVC = [[SecondViewController alloc] init];
   
    //2、导航视图控制器完成推出操作
    [self.navigationController pushViewController:secondVC animated:YES];
   
    //3、释放
    [secondVC release];
}
 
//点击返回按钮返回到某一级视图控制器
- (void)back {
    //1、返回到上一级视图控制器
//    [self.navigationController popViewControllerAnimated:YES];
   
    //2、返回根视图控制器
    /*
    [self.navigationController popToRootViewControllerAnimated:YES];*/
   
    //3、返回到指定的视图控制器
    UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:1];
   
    [self.navigationController popToViewController:vc animated:YES];
}
 
四、模态
 
- (void)next
{
    // ⻚⾯跳转
    // 模态(modal)
    // 1.创建第⼆⻚对象
    SecondViewController *secVC = [[SecondViewController alloc] init];
    // 2.设置过渡动画(有默认值, 可以不设置)
    secVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    // 3.模态控制器
    // 参数1: 第⼆⻚对象
    // 参数2: 是否使⽤动画
    // 参数3: 模态完成后执⾏的block
    [self presentViewController:secVC animated:YES completion:^{
       
    }];
    // 4.内存管理
    [secVC release];
}
 
- (void)back
{
    // 模态返回上⼀⻚
    // 参数1: 是否动画
    // 参数2: 返回完成后执⾏的block
    [self dismissViewControllerAnimated:YES completion:^{
       
    }];
}
原文地址:https://www.cnblogs.com/Walking-Jin/p/5210874.html