我有一个以下的课程,可以圆角化,并在视图上加上阴影。
我有一些需要这种样式的按钮,图像视图和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
}
}
答案 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
,作为干扰视图绘制的机会。但是您不能覆盖扩展中的任何内容。