iOS下NavigationBar解析

iOS下NavigationBar解析

最近在制作基于毛玻璃的一个滑动渐变NavigationBar,对NavigationBar的层级有了一些了解,故做了一个小的总结

这是一个基本的层级:

可以看到,UINavigationBar有一个控制自身颜色的UIBarBackground,与它同级的有两个按钮,done,title等按钮,我们关注的就是UIBarBackground

UIBarBackground

UIImageView其实就是shadowImage,就是NavigationBar下面的那个灰色的线,而UIVisualEffectView这个就是苹果附赠的毛玻璃的控件。要注意EffectFilterView是在最前面的,就是说,这一层将直接决定NavigationBar的颜色

setBarTintColor和setTintColor

The behavior of tintColor for bars has changed on iOS 7.0. It no longer affects the bar’s background and behaves as described for the tintColor property added to UIView. To tint the bar’s background, please use -barTintColor.

setTintColor是在iOS7之前控制颜色的方法,之后的话用的是setBarTintColor,他的层级是:

注意看,这个层级关系中,UIBarBackground的子控件最上层添加了一个EffectFilterView,这就是调用setBarTintColor导致的结果。也就是说,setBarTintColor是一个最能影响NavigationBar颜色的属性(前提是UIBarBackground层级还在,从下文可知,UIBarBackground可能丢失)

乱入的层级关系

一般来说,如果不做太多设置,这个层级关系就是上文所言,但是如果进行了如下设置:

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

或:

self.navigationController.navigationBar.translucent = NO;

问题就变得复杂起来,这个时候的层级是这样的:

这个时候,UIBarBackground这一层都消失了,背景颜色直接由backgroundImage来决定。所以如果要保证要有毛玻璃效果,就不要设置背景图片。

最后的任务-滑动渐变

滑动渐变颜色主要希望这样,就是先让整个Navigationbar透明下来,随着滑动而逐渐不透明,最后变成一个毛玻璃的效果。

这里思路很简单,就是既然要保证毛玻璃存在,那么就不能设置背景色,这个时候如果要透明的话,就只能控制UIBarBackground的透明度,而UIBarBackground获取并没有公共API,这个时候可以添加NavigationBar的分类,修改其第一个子控件

[self.subviews firstObject] .alpha = alpha;
最近的文章

FDTemplateLayoutCell走读

FDTemplateLayoutCell 代码走读最近组内有人使用了这个tableview算cell高库,一看都是自动算高的,让人感觉很不错,故走读代码,研究其具体运行方式。框架地址作者之一首先在博客中提到的使用RunLoop空闲时间执行预缓存任务,这一块代码并没有找到,估计是我看的这个版本已经去掉了这个功能了。- UITableView+FDIndexPathHeightCache.h- UITableView+FDIndexPathHeightCache.m- UITableView+...…

继续阅读
更早的文章

iOS下关于屏幕旋转的一二件小事

控制方向一般的应用,只会支持竖屏正方向一个方向,支持多个屏幕方向的应用还是比较少的。最近在我的项目中,涉及到视频的旋转,跟这个屏幕方向接触比较多,根据网上的几个测试例子,结合项目做了这个总结。怎么控制屏幕方向在 iOS 的应用中,有多种方式可以控制界面的屏幕方向,有全局的,有针对 UIWindow 中界面的控制,也有针对单个界面。单个界面控制单个界面控制主要是指某个ViewController的方向控制。这里要注意,要在ViewController的跟控制器加上方法,一般来说,如果是pus...…

继续阅读