【问题标题】:Swift multiple inheritance solution for IBInspectable/IBDesignable?IBInspectable/IBDesignable 的 Swift 多重继承解决方案?
【发布时间】:2017-01-07 16:56:58
【问题描述】:

我一直在使用 IBInspectable/IBDesignable,就像本文中一样:http://nshipster.com/ibinspectable-ibdesignable/

它展示了如何进行扩展以在情节提要中添加额外的编辑选项。但问题是您无法在预览中看到这些更改。为此,您需要子类化,使用 IBDesignable 并执行 didset{} 的工作。

这样做的问题是您需要为每个股票创建一个子类UIView 子类。所以是UILabelUITextField 等的子类。每次您必须复制/粘贴常规的 UIView 内容时,例如边框和圆角半径。

我不相信 Swift 支持多重继承,这会让事情变得更容易。

假设UIViewIBDesignable 子类称为IBView。有没有办法制作例如UILabelIBView 的子类而不是 UIView

最后,我正在寻找是否有办法让IBDesignable 变得不那么乏味。

【问题讨论】:

  • 据我所知,没有 IBView 这样的东西。你想为几乎所有的 UIKit 视图添加什么属性?对于大多数应用程序,您只需要子类化/扩展一小部分 UIView 子类,因为现有的 UIKit 就足够了。如果您尝试做的事情有多个项目的可重用 IBDesigner/IBInspectable 视图,请将它们放入框架目标并将它们声明为 open。 IB 处理得很好。
  • 不,这是不可能的。使用组合而不是继承。例如,您可以创建一个带有圆角的UIView 子视图,如果您需要在其他任何东西上使用圆角,只需将其包裹到圆角视图中即可。
  • IBView 是我自己编造的 UIView 子类的名称,其中包含额外的 IBDesignable 内容。是的,我正在制作一个可以重复使用的文件。因此,如果没有更简单的方法,这没什么大不了的,但我只是好奇是否有。

标签: ios swift storyboard ibdesignable ibinspectable


【解决方案1】:

和你一样,我正在努力寻找更好的解决方案来使用 IBDesignable。

我做了什么来避免重复相同的代码:

  1. 我对 UIView 进行了扩展,以插入我想要的所有 @IBInspectables(如线半径、边框宽度...)。
  2. 我创建了仅从 UIView、UIButton(或我想要的 UIView 的任何子类)继承的 @IBDesignables,以便在 Interface Builder 上呈现。

检查此代码:

extension UIView {

    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderColor: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor ?? UIColor.clear.cgColor)
        }

        set {
            layer.borderColor = newValue?.cgColor
        }
    }

    @IBInspectable var borderWidth: Double {
        get {
            return Double(layer.borderWidth)
        }

        set {
            layer.borderWidth = CGFloat(newValue)
        }
    }
}

@IBDesignable
class BorderView: UIView { }

@IBDesignable
class BorderButton: UIButton { }

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2019-04-09
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多