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

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

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

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

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


person StartPlayer    schedule 19.06.2018    source источник
comment
Попробуйте rawvalue, чтобы включить перечисление   -  person stevenpcurtis    schedule 19.06.2018
comment
Что, кроме printError, должно быть textColor при выполнении условия default?   -  person dfd    schedule 19.06.2018
comment
@dfd текст установлен в белый цвет в customView .xib. Интересно, что по умолчанию вызывается и ведется журнал. Мы не обрабатывали цвета текста для фона этого цвета. = # 2F8DB3, но это шестнадцатеричное значение - это то, что я пробую выше, и оно должно соответствовать регистру .darkBlue   -  person StartPlayer    schedule 19.06.2018
comment
@dfd У меня нет необработанного значения UIColor, возвращаемого enum, но я изменил переключатель, чтобы проверить свойство .hexString (которое я где-то записал в SO), которое устранило проблему.   -  person StartPlayer    schedule 19.06.2018


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

person StartPlayer    schedule 19.06.2018