属性1:
open var barStyle: UIBarStyle
public enum UIBarStyle : Int {
case `default`
case black
public static var blackOpaque: UIBarStyle { get } // Deprecated. Use UIBarStyleBlack
case blackTranslucent // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
}
虽然上面的枚举有四种样式,但是下面两种已经废弃了,所以不做考虑。
当设置为default
时:
设置为
black
时:屏幕快照 2019-05-09 下午9.54.28.png
可以看到上面两个图的背景颜色、title颜色、状态栏上的元素颜色、item文字颜色不一样,其中前三者是因为barStyle
变化引起的而后者是因为tintColor
属性引起的。
属性2
open var barTintColor: UIColor? // default is nil
官方文档对这个属性的解释是:
The tint color to apply to the navigation bar background.
那么和backgroundColor
的区别是什么呢?下图设置的backgroundColor
为红色,看看下图就明白了。
通过上面的例子可以知道backgroundColor
只是设置NavigationBar
最后面的一个View的背景色,然而这并不是我门想要的结果。所以barTintColor
这个属性还是有不可替代的作用。
属性3
/*
New behavior on iOS 7.
Default is YES.
You may force an opaque background by setting the property to NO.
If the navigation bar has a custom background image, the default is inferred
from the alpha values of the image—YES if it has any pixel with alpha < 1.0
If you send setTranslucent:YES to a bar with an opaque custom background image
it will apply a system opacity less than 1.0 to the image.
If you send setTranslucent:NO to a bar with a translucent custom background image
it will provide an opaque background for the image using the bar's barTintColor if defined, or black
for UIBarStyleBlack or white for UIBarStyleDefault if barTintColor is nil.
*/
@available(iOS 3.0, *)
open var isTranslucent: Bool // Default is NO on iOS 6 and earlier. Always YES if barStyle is set to UIBarStyleBlackTranslucent
注释:
1、iOS7新添加的属性。
2、默认值为YES。
3、你可以通过强制设置此属性为NO,来强制让Bar的背景不透明。
4、如果这个导航栏有一个自定义的背景图,默认值是从背景图中推断出来的。背景图像存在透明度小于1的像素,则默认是为YES,不存在则为NO。
5、如果你将一个具有自定义的不透明的背景图像的Bar的isTranslucent设置为YES,则系统会对图像应用一个小于1的透明度。
6、isTranslucent设置为NO,背景图像半透明,则系统会提供一个不透明的背景,背景的颜色为barTintColor,如果barTintColor为空就要看barStyle,如果UIBarStyleBlack则为黑色,UIBarStyleDefault为白色。
实验
实验1
目的:验证 3
代码
self.view.backgroundColor = UIColor.red
self.navigationController?.navigationBar.alpha = 0.5
self.navigationController?.navigationBar.isTranslucent = false
结果
代码
self.view.backgroundColor = UIColor.red
self.navigationController?.navigationBar.alpha = 0.5
// self.navigationController?.navigationBar.isTranslucent = false
结果
结论:通过上面两个实验3成立。
实验2
目的:验证4
代码1:
self.view.backgroundColor = UIColor.red
print("初始默认值:\(self.navigationController!.navigationBar.isTranslucent)")
var image = imageVithCollor(color: UIColor.green)
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
print("不透明图象默认值:\(self.navigationController!.navigationBar.isTranslucent)")
image = imageVithCollor(color: UIColor.green.withAlphaComponent(0.5))
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
print("透明图象默认值:\(self.navigationController!.navigationBar.isTranslucent)")
结果1:
初始默认值:true
不透明图象默认值:false
透明图象默认值:true
代码2
let image = imageVithCollor(color: UIColor.green)
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
print(self.navigationController?.navigationBar.isTranslucent)
结果2
Optional(false)
结论:4成立
实验3
目的:验证5
代码:
self.view.backgroundColor = UIColor.red
let image = imageVithCollor(color: UIColor.green)
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
self.navigationController?.navigationBar.isTranslucent = true
屏幕快照 2019-05-11 下午5.22.06.png
结论:5成立。
实验4
目的:验证6成立
代码1:
self.view.backgroundColor = UIColor.red
self.navigationController?.navigationBar.isTranslucent = false
self.navigationController?.navigationBar.barTintColor = UIColor.blue
let image = imageVithCollor(color: UIColor.green.withAlphaComponent(0.5))
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
结果1
屏幕快照 2019-05-11 下午6.08.49.png
代码2
self.view.backgroundColor = UIColor.red
self.navigationController?.navigationBar.isTranslucent = false
let image = imageVithCollor(color: UIColor.green.withAlphaComponent(0.5))
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
结果2
屏幕快照 2019-05-11 下午6.14.49.png
代码3
self.view.backgroundColor = UIColor.red
self.navigationController?.navigationBar.isTranslucent = false
let image = imageVithCollor(color: UIColor.green.withAlphaComponent(0.5))
self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
self.navigationController?.navigationBar.barStyle = .black
结果3
屏幕快照 2019-05-11 下午6.19.02.png
结论:6成立
总结:
1、isTranslucent属性决定了bar是否透明(存在透明像素)。
2、存在背景图,根据背景图是否存在透明像素推断默认值,不存在背景图默认值为YES。
3、主动设置YES或NO,比2优先级高。
网友评论