Вызов @IBInspectable, установленный в @IBDesignable, после обновления слоя ограничениями

Я хочу сделать @IBInspectable для UIView, который делает UIView кругом:

@IBInspectable var circleBorder: Bool {
    set {
       layer.cornerRadius = layer.frame.size.width / 2
    }
    get {
        return layer.cornerRadius > 0 ? true : false
    }
}

Проблема в том, что мой @IBInspectable вызывается до того, как ограничения изменяют его значение, и устанавливается неправильный угловой радиус. Можно ли здесь получить размер слоя после ограничений?


person Roo    schedule 05.05.2017    source источник


Ответы (1)


Я не думаю, что есть, но есть лучший способ - разоблачить cornerRadius.

Таким образом, разработчик может делать вещи в своей собственной последовательности. Выставление вещей в Bool означает, что в IB разработчику необходимо (1) создать представление, (2) добавить ограничения, (3) обновить фреймы и затем (4) установить Bool. (Кроме того, я предполагаю, что в Xcode 8, если вы измените устройство в IB - даже после правильной последовательности - все может не обновиться должным образом.

Если у вас нет конкретной причины, которую я не могу придумать, чтобы сделать это Bool, это не только безвредно, но и более настраиваемое.

Код:

@IBInspectable public var cornerRadius:CGFloat {
    get {
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
}
person dfd    schedule 05.05.2017
comment
Да, я использовал это. Но я столкнулся с проблемой, что если размер UIView является динамическим, а ограничения изменяют его, угловой радиус также должен измениться. - person Roo; 05.05.2017
comment
Я вижу, что вы говорите. Возможно, вы не сможете достичь желаемого на 100%. :-( На мой взгляд, это сводится к тому, что IB является инструментом времени разработки, а идеальный круг (frame.size.width/2) является вычислением времени выполнения. У меня был такой же вид что-то случилось - я хотел переместить набор элементов управления снизу направо, в зависимости от ориентации. IB не мог с этим справиться, потому что iPad имеют один и тот же размерный класс независимо от ориентации. В итоге я полностью отказался от IB, так как это легко сделать в коде! - person dfd; 05.05.2017