ios - UIView 子类不能使用 UIView 自定义类?

标签 ios swift class subclass

我有以下类可以圆角并将阴影应用于 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/

相关文章:

ios - tableView.deleteRows 后缺少随机 UITableViewCell

ios - 在 UIWebView 加载时显示 SVProgressHUD

ios - 使用 UITabBarController 的持久 View

c++ - 以buffer为参数的类函数,一头雾水

c# - 程序集中类的顺序

ios - remoteControlReceivedWithEvent 在 iOS 7.0 设备上调用,但在 iOS 8.0 上不调用

ios - NSPersistentStoreCoordinator没有持久性存储(无法打开)

ios - 如何取消在后台运行的线程? (iOS)

java - 生成 UML 类图

ios - 如何在不影响其边框的情况下对按钮的大小调整进行动画处理?