简介
马上就要开始做新的项目,搭完基本框架,闲来系统的纪录一下navigation相关的知识点。
开始了
目前假设有三个控制点,通过push的方法推出,具体关系如下:
vc1 -> vc2 -> vc3
接下来看我一条一条道纪录吧。
1. 看下面的动画
现象:当vc1 -> vc2时,vc1的界面停留了片刻后才消失。
结论:这是因为vc2的背景颜色为nil,可以理解为clear color,因此vc1 -> vc2后,还能看到vc1上的控件,知道vc2完全push出来后,vc1才能完全看不见(当然,具体苹果内部如何实现push效果,暂不做深究)。这个解决简单,只要设置vc2的背景颜色不为透明色就好了。
来看看实现效果吧~
2. navigation bar的透明度
不做任何设置时,navigation bar为半透明,如下图:
只要设置
self.navigationController.navigationBar.translucent = NO;
就可以让让navigation bar变为不透明。
让我们通过reveal展示出来的层次图来看一下:
可以看到,效果和edgesForExtendedLayout属性为UIRectEdgeLeft|UIRectEdgeRight|UIRectEdgeBottom
的效果差不多。(具体edgesForExtendedLayout属性,可以参考我以前的文章UIViewController中edgesForExtendedLayout属性的研究)
3. navigation bar的tint color
默认情况下,是蓝色的:
[self.navigationController.navigationBar setTintColor:[UIColor orangeColor]];
设置tintColor后,是这样的:
4. 返回按钮文字
如果vc1有title,则vc1 -> vc2后可以看到,返回按钮问题为前一个页面的title;如果vc1没有title,则vc1 -> vc2后可以看到,返回按钮文字默认为back。
要想自定义文字,有两种方法:
- 方法一:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
注意:如果该代码写在vc2里,则vc3的返回文字才会变为“返回”,如果想vc2中返回文字变为“返回”,则需要在vc1中设置。
记住原理:新VC的后退按钮文字 是 旧VC的一个属性
- 方法2:
在被push出的controller(vc2、vc3)中添加代码:
```Objective-C
UIBarButtonItem *item = (UIBarButtonItem *)self.navigationController.navigationBar.topItem;
item.title = @"返回";
```
如果不想要文字肿么办?更简单了,上述方法中,title(@"返回")设置为空(@"")就好了。
系统的返回按钮总有一个返回箭头,如果想要更炫的,可以通过self.navigationItem.leftBarButtonItem来设置自己想要的效果。
5. 背景颜色
很多时候,我们都会按平时都想法直接进行设置
self.navigationController.navigationBar.backgroundColor = [UIColor purpleColor];
但是,这样设置会让你大失所望。我们可以看下reveal的分层显示,这个颜色设置的是navigation bar的背景颜色,但是其实navigationBar里面添加了UIView和UIImageView,UILabel等控件,覆盖了navigationBar,所以这种方式设置的背景颜色在前景根本看不出来。
- 方法1:
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor yellowColor]] forBarMetrics:UIBarMetricsDefault];
- 方法2:
[self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]];
结束语
今天就暂时记录到这里,后续会慢慢再补充知识点。有问题可以相互讨论。