美文网首页
Customizing Your App’s Navigatio

Customizing Your App’s Navigatio

作者: 抹不掉那伤1 | 来源:发表于2019-05-11 18:20 被阅读0次

属性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时:

屏幕快照 2019-05-09 下午9.54.43.png
设置为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为红色,看看下图就明白了。

屏幕快照 2019-05-09 下午11.17.14.png

通过上面的例子可以知道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

结果

屏幕快照 2019-05-11 下午4.24.43.png
代码
        self.view.backgroundColor = UIColor.red
        self.navigationController?.navigationBar.alpha = 0.5
//        self.navigationController?.navigationBar.isTranslucent = false

结果

屏幕快照 2019-05-11 下午4.31.05.png

结论:通过上面两个实验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优先级高。

相关文章

网友评论

      本文标题:Customizing Your App’s Navigatio

      本文链接:https://www.haomeiwen.com/subject/egfnoqtx.html