我有以下类可以圆角并将阴影应用于 View 。
我有需要这种样式的按钮、 ImageView 和 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
}
}
最佳答案
I should be able to apply this class to anything that is a subclass of UIView such as buttons. What am I getting wrong here?
您缺少的是类/子类层次结构的整个基本性质。 UIView 的子类不是 UIButton 的子类,反之亦然;他们是独立的。省略一些中间子类,您通过说 class RoundedShadowView : UIView
创建的是这种安排(关于已经存在的 UIView 子类,例如 UIButton):
UIView
/ \
/ \
/ \
/ \
UIButton RoundedShadowView
UIButton(比方说)和 RoundedShadowView 之间没有,也永远不可能有层次关系。他们都是 UIView 的 child ,所以实际上他们是兄弟。我的兄弟不能神奇地成为我的父亲或我的儿子。 UIButton 永远不能是 RoundedShadowView,RoundedShadowView 永远不能是 UIButton。
现在,如果您希望创建一些许多 UIButton 都可以获得的功能,您可以通过子类化 UIButton 并使您的按钮成为该子类的实例来解决问题:
UIView
|
UIButton
|
RoundedShadowButton
|
(actual buttons)
但您想要的不止于此:您希望此功能应用于按钮和标签以及您喜欢的任何其他内置 UIView 子类。因此,您不能简单地使用子类化来解决问题(如上面的第一个图表充分展示的那样)。
相反,您必须找到一种方法注入(inject)所需的功能到 UIView 本身或到应该获取它的特定子类中.那必须通过某种扩展:
您可以扩展 UIView,这样每个 UIView 都是一个潜在的圆形阴影 View ,并且任何 UIView 子类都有可能表现得像一个圆形阴影 View 。
或者,如果您想更具选择性,您可以编写一个协议(protocol),扩展该协议(protocol)以具有圆形阴影 View 功能,然后只制作按钮和标签以及 ImageView (或特定按钮、标签、和 ImageView 子类)采用该协议(protocol)。
但是,要做到这一点并不容易,或者至少不像最初的草图那么简单。您的草图涉及覆盖 layoutSubviews
作为干扰 View 绘制的机会。但是您不能覆盖扩展中的任何内容。
关于ios - UIView 子类不能使用 UIView 自定义类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016429/