一、导航控制器
例如,有a b c d四个页面之间交互。如果吧A作为根视图控制器则:
需要在appDelegate中执行如下操作。
FirstViewController *first = [[FirstViewController alloc]init];
//在这里做一个导航控制器,专门用来控制导航控制器的VC的,并把first作为整个导航控制的根视图控制器。
//导航控制器本身也是一个试图控制器。也有试图控制器的所有特征。
UINavigationController *nav =[[UINavigationController alloc] initWithRootViewController:first];
//释放first
[first release];
//把nav当根。
self.window.rootViewController = nav;
注:
/*
导航条的frame是 0 ,20,320,44.
ios7之前导航条不影响状态条颜色,之后会影响。
*/
first到second:
核心代码在first中建一个btn,点击方法中实现:SecondViewController *second =[[SecondViewController alloc]init];
//使用导航控制器吧second页面push出来,也叫把second压栈(入栈)。
[self.navigationController pushViewController:second animated:YES];//第一个参数是要去的VC,第二个是要不要动画。
[second release];
/*
1.吧一个新的VC添加进导航控制器的过程叫做入栈,结果会是的新的VC显示在界面上。
2. 如果当前的VC是一个导航控制器的一员,就可以通过self.navigationController找到它梭子的导航控制器。
3.使用导航控制器的 push方法,对心的VC执行入栈操作,引用计数会有一个自动加1
4.所谓栈,就是后进先出,如:first先进,second后进,那么将来肯定second先从导航控制器中被移除掉。
*/
从third回到根视图:
在点击方法中:
//使用popToRootViewControllerAnimated进行出栈操作,返回的是导航控制器的根视图控制器
//同时堆当前VC与根视图控制器之间的所有VC执行那个出栈-1操作。
[self.navigationController popToRootViewControllerAnimated:YES];
从second返回上一个视图页面:
//返回上个页面
[self.navigationController popViewControllerAnimated:YES];
/*
使用self.navigationController 执行pop方法对自己进行出栈操作,也就是返回上一页。
出栈时候就相当于吧可变数组最后一位remove掉了,执行一个自动的-1;
*/
从fourth回到second,则需要:
//找到想去的VC,self.navigationController.viewControllers是一个数组,里面存了所有入栈的VC,通过下表就能找到对应的VC。
// SecondViewController *second = [[SecondViewController alloc] init];
UIViewController *targetVC = self.navigationController.viewControllers[1];
//通过pop返回目标VC,并对当前与目标之间的所有VC执行-1出栈操作。
[self.navigationController popToViewController:targetVC animated:YES];
二、NavBar(使用系统方法)
设置导航条的风格
1. self.navigationController.navigationBar这个可以找到当前的视图导航条
self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
// self.navigationController.navigationBar.backgroundColor = [UIColor greenColor];
//self.navigationController.navigationBar.tintColor = [UIColor greenColor];
2. 贴一个图给bar
UIImage *img = [UIImage imageNamed:@"navBg.png"];
//给导航条设置背景图片(竖屏图片设置)
[self.navigationController.navigationBar setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
//land是横屏 ,default是竖屏。
UIImage *imgLand = [UIImage imageNamed:@"navBg-32.png"];
//横屏图片设置。
[self.navigationController.navigationBar setBackgroundImage:imgLand forBarMetrics:UIBarMetricsLandscapePhone];
//设置title
self.navigationItem.title = @"这是老大";
其他的Bar设置
1、设置titleView(任何UIView的子类都可以)
UIView *view= [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];//这里写的x,y没作用,最后肯定回居中。
view.backgroundColor = [UIColor yellowColor];
self.navigationItem.titleView = view;
[view release];
2、设置navBar的ButtonItem
//我们可以参考UIButton,但他不是
//第四个参数是方法
//吧做好的item赋值给bar上的左item
UIBarButtonItem *leftBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"回First" style:UIBarButtonItemStyleDone target:self action:@selector(leftDown)];
self.navigationItem.leftBarButtonItem = leftBtnItem;
[leftBtnItem release];
//左侧items
UIBarButtonItem *left1 = [[UIBarButtonItem alloc]initWithTitle:@"1" style:UIBarButtonItemStylePlain target:self action:@selector(leftDown)];
UIBarButtonItem *left2 = [[UIBarButtonItem alloc]initWithTitle:@"2" style:UIBarButtonItemStylePlain target:self action:@selector(leftDown)];
NSArray *itemArr = @[left1,left2];//同时放两个左items
self.navigationItem.leftBarButtonItems = itemArr;
[left1 release];
[left2 release];
//右侧
UIBarButtonItem *right1 = [[UIBarButtonItem alloc] initWithTitle:@"3" style:UIBarButtonItemStylePlain target:self action:@selector(leftDown)];
UIBarButtonItem *right2 = [[UIBarButtonItem alloc] initWithTitle:@"4" style:UIBarButtonItemStylePlain target:self action:@selector(leftDown)];
NSArray *itemArr2 =@[right1,right2];
self.navigationItem.rightBarButtonItems = itemArr2;
[right1 release];
[right2 release];
//其他类型的BarButtonItem
UIBarButtonItem *right3 = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"0.png"] style:UIBarButtonItemStylePlain target:self action:@selector(leftDown)];
// self.navigationItem.leftBarButtonItem = right3;
3、贴图型
UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
rightBtn.frame = CGRectMake(0, 0, 80, 44);
[rightBtn setTitle:@"你猜" forState:UIControlStateNormal];
[rightBtn addTarget:self action:@selector(leftDown) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *right9 = [[UIBarButtonItem alloc]initWithCustomView:rightBtn];
//贴UIView的任意子类对象。
NSArray *rightLastItemArr = @[right3,right9];
self.navigationItem.rightBarButtonItems = rightLastItemArr;//右侧items为两个,一个为文字型的,一个为贴图型的。
三、自定义状态栏
首先在appDelegate中将first设置为根视图控制器。
然后再first中隐藏系统导航条:
//隐藏系统导航条
self.navigationController.navigationBarHidden =YES;
然后自定义imageView、label、button等构成一个itemBar。。。
详见/Users/qianfeng/liguoting/8.11/CustomNavBar/CustomNavBar/FirstViewController.m中实现。有封号的导航条类。