Пользовательский класс UIView не может использоваться подклассами UIView? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть следующий класс, который закругляет углы и применяет тень к видам.

У меня есть кнопки, изображения и UILabels, которые нуждаются в этом стиле. Вместо создания RoundedShadowImageView, RoundedShadowButtonView и т. Д. Я хотел бы иметь только один класс.

Когда я иду, чтобы назначить RoundedShadowView для чего-либо, кроме простого UIView, класс не отображается в качестве опции. Я должен иметь возможность применять этот класс ко всему, что является подклассом UIView, например кнопкам.

Что я тут не так делаю?

class RoundedShadowView : UIView {

    @IBInspectable var cornerRadius: CGFloat = 0
    var shadowLayer: CAShapeLayer!
    private var fillColor: UIColor = .white // the color applied to the shadowLayer, rather than the view's backgroundColor

    override func layoutSubviews() {
        super.layoutSubviews()
        if shadowLayer == nil {
            self.applyShadowLayerWith(cornerRadius: cornerRadius, fillColor: self.backgroundColor ?? .white, toView: self)
        }
        self.backgroundColor = .clear
    }
}

1 Ответ

0 голосов
/ 27 октября 2018

Я должен иметь возможность применять этот класс ко всему, что является подклассом UIView, например кнопкам.Что я здесь не так делаю?

Чего вам не хватает, так это всей базовой природы иерархии классов / подклассов.Подкласс UIView не является подклассом UIButton и наоборот;они независимы.Если оставить несколько промежуточных подклассов, то, что вы создали, сказав, class RoundedShadowView : UIView, является этим механизмом (в отношении уже существующего подкласса UIView, такого как UIButton):

           UIView
           /    \
          /      \
         /        \
        /          \
     UIButton   RoundedShadowView

Нет, и никогда не может бытьиерархическая связь между UIButton (скажем) и RoundedShadowView.Они оба дети UIView, так что, по сути, они братья.Мой брат не может волшебным образом стать моим отцом или сыном.UIButton никогда не может быть RoundedShadowView, а RoundedShadowView никогда не может быть UIButton.

Теперь, если вы хотите создать некоторую функциональность, которую могут получить многие UIButton-ы, вы можете решить эту проблему, создав подкласс UIButton и сделав свои кнопкиэкземпляры этого подкласса:

         UIView
            |
         UIButton
            |
       RoundedShadowButton
            |
        (actual buttons)

Но вам нужно нечто большее: вы хотите, чтобы эта функциональность применялась к кнопкам и меткам и любому другому встроенному подклассу UIView, который вам нравится.Поэтому вы просто не можете использовать подклассы просто и ясно для решения проблемы (как показано на первой диаграмме выше).

Вместо этого вы должны найти способ внедрить желаемую функциональность в сам UIView или в определенные подклассы , которые должны его получить.Это должно быть через расширение некоторого вида:

  • Вы можете расширить UIView, чтобы каждый UIView представлял собой потенциальное представление с закругленными тенями и любой подкласс UIView.обладает потенциалом действовать как представление с закругленными тенями.

  • Или, если вы хотите быть более избирательным, вы можете написать протокол, расширить протокол, чтобы иметь функциональность представления с закругленными тенями,и затем заставить только кнопки и метки и представления изображений (или определенные подклассы кнопок, меток и изображений) принимать этот протокол.

Однако сделать это будет непросто,или, по крайней мере, не так просто, как ваш первоначальный эскиз.Ваш эскиз включает переопределение layoutSubviews как возможность помешать рисованию вида.Но вы не можете ничего переопределить в расширении.

...