@IBDesignable视图上的标签颜色显示不同的设备

时间:2018-06-19 10:13:39

标签: swift ibdesignable

我有一个@IBDesignable自定义视图。它包含一个带有两个子类UILabel的UIView。 UILabel的自定义子类正在设置它的字体。

我想要实现的目标是通过使视图的背景颜色成为可检查的属性来改变文本颜色,使其变得清晰易读。

我的代码如下。 Custom.Colour.<name>只是定义颜色的枚举。

@IBDesignable
class CustomMiniView: UIView, NibLoadable {

public var view:UIView!

@IBOutlet weak var colourView: UIView!
@IBOutlet weak var headingLabel: CustomUILabel!
@IBOutlet weak var amountLabel: CustomUILabel!

@IBInspectable var blockColor:UIColor! {
    didSet {

        self.colourView.backgroundColor = blockColor

        switch blockColor {

        case Custom.Colour.darkBlue:
            headingLabel.textColor = .white
            amountLabel.textColor = .white

        case Custom.Colour.blue:
            headingLabel.textColor = .white
            amountLabel.textColor = .white

        case Custom.Colour.lightBlue:
            headingLabel.textColor = Custom.Colour.grey
            amountLabel.textColor = Custom.Colour.blue

        case Custom.Colour.green:
            headingLabel.textColor = .white
            amountLabel.textColor = .white

        case Custom.Colour.lightGreen:
            headingLabel.textColor = Custom.Colour.grey
            amountLabel.textColor = Custom.Colour.blue

        case Custom.Colour.yellow:
            headingLabel.textColor = Custom.Colour.grey
            amountLabel.textColor = Custom.Colour.grey

        default : printError("We have not handled text colours for a background of this colour. = \(blockColor.hexString)")
        }
    }
}

public override init(frame: CGRect) {
    super.init(frame: frame)

    self.setupFromNib()
    self.commonInit()
}

public required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    self.setupFromNib()
    self.commonInit()

}

func commonInit() {
    self.backgroundColor = .clear
}

}

这对我来说很好,但是当时我得到的报告显示文字在任何地方都显示为白色并且发送了一个让我感到困惑的屏幕截图。当我在模拟器和不同的设备中运行它时,我能够看到这不起作用。以下是我在iPad上发生的事情和我期望发生的事情的两个屏幕截图,以及一些其他设备和模拟器上发生的事情的屏幕截图。

这是我的设备上发生的事情以及预期的结果。 Correct and expected result.

这是在其他设备上发生的事情和不正确的结果。 enter image description here

这是否会出现不同设备的原因?我不知道原因或如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

感谢上面的评论我发现了一个问题。

我没有对颜色进行切换,而是对已经有效的颜色的.hexString进行了切换。

    switch blockColor.hexString {

    case Custom.Colour.darkBlue.hexString :

表示记录hexString是UIColor

的扩展名
    var hexString: String {
    let colorRef = cgColor.components
    let r = colorRef?[0] ?? 0
    let g = colorRef?[1] ?? 0
    let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0
    let a = cgColor.alpha

    var color = String(
        format: "#%02lX%02lX%02lX",
        lroundf(Float(r * 255)),
        lroundf(Float(g * 255)),
        lroundf(Float(b * 255))
    )

    if a < 1 {
        color += String(format: "%02lX", lroundf(Float(a)))
    }

    return color
}

我仍然不确定为什么开启hexString工作并且枚举中的UIColor不能始终如一地工作但是由于有关这些的评论帮助我找到了自己修复它的解决方案。另一个问题是为什么开启UIColor会不可靠,但现在重新开始工作。