⼀、UINavigationController
- UINavigationController:导航控制器,是iOS中最常⽤的多视图 控制器之⼀,⽤它来管理多个视图控制器。
- 导航控制器可以称为是,管理控制器的控制器,主要管理有层 次递进关系的控制器。
- UINavigationController继承于UIViewController,以栈的⽅式管 理所控制的视图控制器,⾄少要有⼀个被管理的视图控制器, 这个控制器我们称作,导航控制器的根视图控制器。
- 任何继承⾃UIViewController的类(多态)都可以作为根控制器。
//导航视图控制器也是一个视图控制器,TA管理了多个子视图控制器,是系统提供给我们的容器视图控制器
//导航视图控制器至少管理了一个子视图控制器,这个视图控制器称为导航视图控制器的根视图控制器
//导航视图控制器至少管理了一个子视图控制器,这个视图控制器称为导航视图控制器的根视图控制器
//如果我们的程序想要采用导航视图控制器进行布局,我们需要指定window的根视图控制器为导航视图控制器
// 创建根视图器的根视图控制器
RootViewController *rootVC = [[RootViewController alloc] init];
// 创建导航控制器 把rootVC作为导航控制
UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:rootVC];
//设置导航栏的显隐属性
// naVC.navigationBarHidden = YES;
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];
//设置导航条的背景颜色
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,可以配置当前页面导航条的显示内容,比如左、右按钮,标题等
//每一个加到导航视图控制器内部的视图控制器自带一个属性叫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];
//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;
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];
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)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)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];
{
// ⻚⾯跳转
// 模态(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:^{
}];
{
// 模态返回上⼀⻚
// 参数1: 是否动画
// 参数2: 返回完成后执⾏的block
[self dismissViewControllerAnimated:YES completion:^{
}];
}