今天,笔者在设置UINavigationBar样式时,忽然萌生了要去真正了解它层级结构的想法(之前笔者对其的认识也仅局限于属性样式的设置),于是便有了下文。虽然本文内容深意可能稍显浅薄,但是如果能对大家提供些许帮助,那也是颇有意义之事。
下面,笔者就以一个项目实例带领大家分析navigationBar的层级结构。
首先,我们在Xcode新建一个项目,并在storyboard中新建一个导航控制器,设置导航控制器的rootViewController为viewController(UIViewController类型),运行项目后会得到如下的导航栏样式。
接着,我们打开Xcode的视图层次调试(view hierarchy debug),会发现navigationBar中存在两个UIImageView类型的子控件,名称分别为_UINavigationBarBackground
、UINavigationBarBackIndicator
大家知道在iOS 7之后,设置tintColor属性无法改变导航栏的颜色,而改为使用barTintColor
属性来控制背景色。我们可以在viewController的viewDidLoad
方法中设置这个属性
[self.navigationController.navigationBar setBarTintColor:[UIColorredColor]];
这时我们打开视图调试,会发现在_UINavigationBarBackground控件中增加了一个红色的
UIView
.于是我们可以得出UINavigationBar是通过在_UINavigationBarBackground中添加一个UIView来改变背景颜色的这样的结论。
另外,我们除了通过barTintColor属性改变navigationBar的背景色,还可以通过
setBackgroundImage: forBarMetrics:
方法来设置navigationBar的背景图片。
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bmw_bg"] forBarMetrics:UIBarMetricsDefault];
注意:UIBarMetrics
必须设置为UIBarMetricsDefault
,否则无法显示背景图片
设置完背景图片后,大家会发现我们之前设置的背景颜色看不见了,也许大家会认为是背景图片将其掩盖了,那么事实是否如此呢?我们可以继续打开视图调试:
我们会惊奇的发现,之前的UIView居然消失了,这是为什么呢?笔者试过先设置背景图片再设置BarTintColor,结果也是如此,其中的确切原因笔者也不知晓,只能猜测苹果是认为设置背景图片的优先级大于设置背景颜色,而设置背景颜色又是通过UIView来实现的,既然这个View已经无法显示,那么出于性能考虑将其直接移除也是情理之中。如果有知道真正原因的小伙伴,感谢评论告诉。