Цвета надписей в представлении @IBDesignable выглядят разными на разных устройствах

У меня есть пользовательское представление @IBDesignable. Он содержит UIView с двумя подклассами UILabels. Пользовательский подкласс 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, и того, что я ожидаю, и снимок экрана того, что происходит на некоторых других устройствах и симуляторе.

Это то, что происходит на моем устройстве и ожидаемый результат. Правильный и ожидаемый результат

Это то, что происходит на других устройствах и неверный результат. введите описание изображения здесь

Есть ли причина, по которой это может показаться разным на разных устройствах? Я в недоумении по поводу причины или как это исправить.

1 ответ

Благодаря комментариям выше я нашел исправление.

Вместо того чтобы переключать цвет, я сделал переключение на.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 в enum не работал согласованно, но благодаря комментариям об этом, я помог найти решение, чтобы исправить это самостоятельно. Вопрос в другой раз, почему переключение на UIColor было бы ненадежным, но теперь вернемся к работе.

Другие вопросы по тегам