情形一:
self.navigationBar.barTintColor = [UIColor redColor];
self.navigationBar.translucent = NO
进行如上颜色和透明度设置时,层级结构如图,其中_UIBarBackground的颜色为barTintColor设置的颜色
情形二:
self.navigationBar.barTintColor = [UIColor redColor];
self.navigationBar.translucent = YES
将一种的translucent改为NO,图中多了一层UIVisualEffectView视图;UIVisualEffectView中有三个子视图,其第二层视图_UIVisualEffectFilterView为半透明色,会使barTintColor设置的颜色效果变暗,第三层显示为barTintColor设置的颜色,即图中的红色视图。
情形三:
self.navigationBar.barTintColor = [UIColor redColor];
self.navigationBar.translucent = YES
[self.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor greenColor]] forBarMetrics:UIBarMetricsDefault]
在情形二的基础上添加背景图片时,效果如下。由于添加了BackgroundImage,即使设置了透明图层,UIVisualEffectView图层也不会出现,另外barTintColor的颜色也看不到效果。这是因为barTintColor的颜色作用在_UIVisualEffectFilterView图层上了。
情形四:
self.navigationBar.barTintColor = [UIColor redColor];
self.navigationBar.translucent = NO
[self.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor greenColor]] forBarMetrics:UIBarMetricsDefault]
在情形三的基础上,修改translucent属性为NO,此时可以看到_UIBarBackground的颜色为barTintColor设置的颜色
总结:
当translucent = YES时,层级结构中多一层UIVisualEffectView,navigationBar.barTintColor的颜色作用在UIVisualEffectView的子类_UIVisualEffectFilterView上;
-当translucent = NO时,UIVisualEffectView层隐藏,navigationBar.barTintColor的颜色作用在_UIBarBackground上;当设置了BackgroundImage,无论translucent为何值,UIVisualEffectView层都会隐藏,但会影响barTintColor设置的颜色是否显现