UIView自定义类不能由UIView子类使用?

时间:2018-10-26 21:19:10

标签: ios swift class subclass

我有一个以下的课程,可以圆角化,并在视图上加上阴影。

我有一些需要这种样式的按钮,图像视图和UILabel。而不是创建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 :(得分:1)

  

我应该能够将此类应用于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,作为干扰视图绘制的机会。但是您不能覆盖扩展中的任何内容。