Быстрое решение множественного наследования для 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.

Что я сделал, чтобы избежать повторения того же кода:

  1. Я сделал расширение UIView, чтобы вставить все нужные мне @IBInspectables (например, радиус кордера, ширину границы...).
  2. Я создал свои @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 { }

Я надеюсь, что это поможет вам!

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