首页 文章

更改仍可在界面构建器/故事板中覆盖的默认属性的默认值

提问于
浏览
0

让我们假设我想创建一个标记为IBDesignable的自定义ui类,以便我可以在故事板中使用它,是否可以覆盖默认属性的默认值但仍允许在故事板中覆盖它?

例如,如果我想创建一个自定义UILabel,我可以将它的默认backgroundColor重写为红色,这样每次我将它添加到storyboard中的视图时,默认情况下它将具有红色背景颜色(而不是它通常具有的默认白色) ),但如果我将颜色更改为故事板中的任何其他颜色,它将保持新的颜色 .

我知道我可以添加一个特定的IBInspectable属性作为backgroundColor的代理,但这不是最佳的,因为这会让我在我控制相同事物的对象上有2个属性(backgroundColor) .

那么有谁知道这样做的方法?

1 回答

  • 1

    您可以使用外观代理执行此操作 . 它专门为自定义子类提供自定义默认值 .

    必须在加载故事板之前完成对外观代理的调用 . 一种方法是使用 initialize 类方法 .

    class MyCustomLabel: UILabel
    {
        override class func initialize() {
            if (self === MyCustomLabel.self) {
                MyCustomLabel.appearance().backgroundColor = .red
            }
        }
    }
    

    并非所有属性都可以参与外观代理 . 可以使用Objective-C标头中的 UI_APPEARANCE_SELECTOR 宏标记的那些 . 显示类的Objective-C标头的一种方法是命令点击注释中的类名(实际上这可能是一个bug ...)

    // Copy this comment in you code an click on this: UIView
    

    要在“界面”构建器中呈现此默认颜色,可以使用 prepareForInterfaceBuilder 方法,如下所示:

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        if (self.backgroundColor == nil) {
            self.backgroundColor = .red
        }
    }
    

    请注意,虽然它会正确渲染背景,但颜色下拉菜单仍会显示“默认”颜色 .

相关问题