背景控制
在IOS7中使用barTintColor
来控制导航栏的背景色:
[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];
[图片上传失败...(image-f6cb8c-1518236524027)]
这个设置方法可以在AppDelegate
中设置,全局可以生效。
如果希望使用图片来作为导航的背景,那么需要注意的是ios7中图片的高度问题。上面提到过了,ios7导航栏的高度其实是算上状态栏的,即44+20=64个点的高度。可以通过setBackgroundImage
来设置:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault];
前景控制
前景控制分为标题控制和返回按钮(等系统按钮)的控制
标题需要通过setTitleTextAttributes来设置,相对比较复杂一些,例如:
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,
shadow, NSShadowAttributeName,
[UIFont fontWithName:@ "HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil]];
[图片上传失败...(image-3fc529-1518236524027)]
设置返回按钮(等系统按钮)可以通过TintColor
,直接来设置颜色
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
显示设置
有时我们希望导航栏不显示,而有时又希望显示,那么最好通过每个个体的VC来控制,如果某个VC需要与其他VC有所区别,那么最好是“负责到底”,即在进入VC时改变导航栏的显示状态,而退出时还原:
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController.navigationBar setHidden:YES];
[self.rdv_tabBarController setTabBarHidden:YES animated:NO];
}
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.navigationController.navigationBar setHidden:NO];
[self.rdv_tabBarController setTabBarHidden:NO animated:NO];
}
如何在有导航栏的情况下定位控件的Y
可能初学ios的同学(尤其是通过手写代码布局的同学)都会有这么个感受,为什么我的控件有的时候明明定位在VC上,但会被导航栏遮住,那么你可能会得出结论原点(0,0)是在屏幕的左上角被导航栏遮住的;而对于像UITableView
这样的,设置了全屏铺满,怎么就没有被导航栏遮住呢?原点难道不在左上角?
我也被这个问题困扰了很久,这里谈一下最近的一个理解。我们拿UITextView
来看
当我们把一个UITextView
放到一个没有导航的VC中时:
UITextView *textView = [[UITextView alloc] init];
textView.frame = CGRectMake(10, 200, 300, 120);
textView.backgroundColor = [UIColor redColor];
textView.text = @"游戏分两种,一种是在生活中玩的,另一种是生活在其中的。这两个世界相互矛盾,而两位约翰就分别属于这不同的世界。";
textView.font = [UIFont boldSystemFontOfSize:40];
textView.editable = NO;
[self.view addSubview:textView]
效果是这样的,看起来并没有什么问题
然而如果我们把这个VC放到一个导航控制器中,同样的代码却是这样结果
首先,看起来UITextView
距离设备顶部的绝对距离似乎并没有变化,但是请注意UITextView
的滚动条,滚动条竟然没有顶部对齐,而且文字也向下移位了,看起来空出一大块。仔细看空出的这段高度其实刚好是导航栏的高度64个点!!经过搜索,我发现只要设置如下代码即可恢复这种异常的状况:
self.automaticallyAdjustsScrollViewInsets = NO;
这下明白了,原来VC会对其内部的UIScrollView
的内容部分进行一个Inset
,这个Inset
在上半部分刚好就对应导航栏的高度,而UIScrollView
包括UITableView
和UITextView
等。到这里,似乎有些问题明朗了:
- VC中的view默认会对
UIScrollView
做一个适应导航栏的处理,由此推测,其实只要是VC中的控件,都是从设备左上角的(0,0)开始算的,只是对于UIScrollView
,VC会自动调整一下内容的位置而已。 - 在有导航的情况下,可视范围的Y坐标就是从64开始的,除了
UIScrollView
的控件,定位的时候,都应当以(0,64)为原点;而UIScrollView
如果是全屏的,那么无所谓,如果不是全屏的,请注意是否需要设置VC的automaticallyAdjustsScrollViewInsets
。
参考 IOS状态栏和导航栏的控制问题