2017-06-06 69 views
0

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

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

我知道我可以添加一个特定的IBInspectable属性作为backgroundColor的代理,但这并不是最优的,因为那会让我在控制同一事物(backgroundColor)的对象上留下两个属性。

那么有没有人知道一种方法来做到这一点?

回答

1

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

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

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

并非所有属性都可以参与外观代理。那些可以用Objective-C头文件中的UI_APPEARANCE_SELECTOR宏标记的。显示类的Objective-C的头一种方法是在注释里面的类名Command键(这可能是一个错误实际上...)

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

为了使这个默认的颜色界面生成器,你可以使用prepareForInterfaceBuilder方法,像这样:

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

注意的是,虽然它会正确渲染背景,颜色下拉菜单仍然会显示在“默认”的色彩。

+0

这似乎确实起作用,虽然我得到了有关初始化的警告,并不保证被Swift调用,所以它可能不是一个面向未来的解决方案。但更糟糕的是,它也没有在故事板中显示新的默认颜色,这就是为什么我想要这件事的原因 – SveinnV

+0

对不起,我不知道如何指示界面生成器来获取默认颜色,但也许这是可能的......至于'initialize',你说得对,这是一个Objective-C的东西,它可能在Swift中有不同的表现。试着把这个调用放在'application(_:didFinishLaunchingWithOptions)'中,如果这太迟了,把它放到'AppDelegate'初始化程序中 – deadbeef

+0

@SveinnV查看我的编辑 – deadbeef