Быстрое решение множественного наследования для IBInspectable/IBDesignable?
Я играл с IBInspectable/IBDesignable, как в этой статье: http://nshipster.com/ibinspectable-ibdesignable/.
Он показывает, как вы можете сделать расширение для добавления дополнительных опций редактирования в раскадровку. Проблема, однако, в том, что вы не можете увидеть эти изменения в предварительном просмотре. Для этого нужно создать подкласс, использовать IBDesignable
и сделать didset{}
вещи.
Проблема в том, что вы должны сделать подкласс каждой акции UIView
подкласс. Таким образом, подкласс UILabel
, UITextField
и так далее. Каждый раз, когда вам нужно скопировать / вставить обычный UIView
такие вещи, как границы и угловой радиус.
Я не верю, что Swift поддерживает множественное наследование, что сделало бы это намного проще.
Скажем ваш IBDesignable
подкласс UIView
называется IBView
, Есть ли способ сделать, например, UILabel
быть подклассом IBView
вместо UIView
?
В конце я смотрю, есть ли способ сделать IBDesignable
менее утомительно
1 ответ
Как и вы, я пытаюсь найти лучшее решение для работы с IBDesignable.
Что я сделал, чтобы избежать повторения того же кода:
- Я сделал расширение UIView, чтобы вставить все нужные мне @IBInspectables (например, радиус кордера, ширину границы...).
- Я создал свои @IBDesignables, которые наследуются только от UIView, UIButton (или любого подкласса UIView, который я хочу) для визуализации в Интерфейсном Разработчике.
Проверьте этот код:
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor ?? UIColor.clear.cgColor)
}
set {
layer.borderColor = newValue?.cgColor
}
}
@IBInspectable var borderWidth: Double {
get {
return Double(layer.borderWidth)
}
set {
layer.borderWidth = CGFloat(newValue)
}
}
}
@IBDesignable
class BorderView: UIView { }
@IBDesignable
class BorderButton: UIButton { }
Я надеюсь, что это поможет вам!