2017-01-07 2 views
0

Я играл с IBInspectable/IBDesignable, как в этой статье: http://nshipster.com/ibinspectable-ibdesignable/.Быстрое решение множественного наследования для IBInspectable/IBDesignable?

Он показывает, как можно сделать расширение, чтобы добавить дополнительные параметры редактирования в раскадровку. Однако проблема состоит в том, что вы не можете увидеть эти изменения, отраженные в предварительном просмотре. Для этого вам нужно подклассы, используйте IBDesignable и сделайте didset{}.

Проблема заключается в том, что вам необходимо сделать подкласс каждого запаса UIView подкласса. Таким образом, подкласс UILabel, UITextField и так далее. Каждый раз, когда вам приходится копировать/вставлять обычные файлы UIView, такие как границы и угловой радиус.

Я не верю, что Swift поддерживает множественное наследование, что сделало бы это намного проще.

Скажем, ваш IBDesignable подкласс UIView называется IBView. Есть ли способ сделать, например, UILabel быть подклассом IBView вместо UIView?

В конце концов, я смотрю, есть ли способ сделать IBDesignable менее утомительным.

+0

Нет такой вещи, как IBView, насколько я знаю. Какие атрибуты вы пытаетесь добавить к тому, что кажется почти всеми видами UIKit? Для большинства приложений вам нужно только подклассы/расширить очень небольшую часть подклассов UIView, так как хватает UIKit. Если то, что вы пытаетесь сделать, имеет многоразовые представления IBDesigner/IBInspectable для нескольких проектов, бросает их в целевой объект и объявляет их как ** открытыми **. IB отлично справляется с этим. – dfd

+0

Нет, это невозможно. Используйте композицию вместо наследования. Например, вы можете создать подпункт 'UIView' с закругленными углами, и если вам нужно закругленные углы на что-нибудь еще, просто оберните это в округленное представление. – Sulthan

+0

IBView - это то, что я составил себе как название подкласса UIView, в котором есть дополнительные IBDesignable. Да, я делаю один файл, который я могу повторно использовать. Так что это не так уж и важно, если нет более простого способа, но мне просто интересно, если есть. – Janneman

ответ

2

Как и вы, я пытаюсь найти лучшее решение для работы с IBDesignable.

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

  1. я сделал расширение UIView, чтобы вставить все @IBInspectables я хочу (например, радиус Corder, ширина границы ...).
  2. Я создал свои @IBDesignables, которые наследуют только UIView, UIButton (или любой подкласс UIView, который я хочу) для визуализации в Interface Builder.

Проверьте этот код:

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 { } 

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

Смежные вопросы