你可以使用类别/扩展将IBDesignable属性添加到UIView?

对于那些不知道我在说什么的人,Xcode 6.0增加了一些新function,IBDesignable和IBInspectable。

当您使用IBInspectable属性标记自定义视图时,这些属性将显示在IB的属性检查器中。

同样的,当你使用IBDesignable标记一个自定义的UIView子类时,Xcode编译你的视图并调用代码在Xcode窗口中显示你的视图对象,这样你就可以看到它们的样子。

在自定义视图中添加IBDesignable和IBInspectable属性的技术在Swift和Objective-C中非常相似。 无论您使用哪种语言来定义它们,IBInspectable属性都将显示在Interface Builder属性检查器中。

我已经在Objective-C中创build了一个UIView类,并在Swift中扩展了UIView,它将视图底层的borderWidth,cornerRadius,borderColor和layerBackgroundColor属性作为视图的属性进行提升。 如果更改属性,则扩展名/类别会根据需要进行types转换,并将更改转发给图层。

IBInspectable部分效果很好。 我看到并可以在IB属性检查器中设置新属性。

我可以发誓,上周,我的视图类别/扩展的IBDesignable属性也工作,我可以看到我的自定义UIView类别在IB中呈现与它的改变图层属性。 本周它不工作。

我是幻觉吗?

在使用IBDesignable进行设置时,现有系统类的类别/扩展可以在Interface Builder中绘制自定义UI吗?

由于发布这个问题,我已经了解到@IBDesignable不适用于类扩展。 您可以添加标签,但不起作用。

@IBDesignable仅在自定义类中使用UIView扩展。例如。 UILabel是UIView的默认子类。 它不会在那里工作,但是如果你制作一个名为MyUILabel的子类化UILabel的自定义类。 将MyUILabel类分配给正在处理的Label。 然后你的angular落半径UIView扩展将工作这个MyUILabel。 (我想你的第一周工作是因为你正在处理一些自定义类。)

我已经为我的用例做了这个工作,通过在视图控制器中设置一个@IBDesignable UIView作为顶视图。 我特别的用例是使用默认的UIKit视图在Interface Builder中显示ClassyKit样式,而不必为此而创build子类,而且工作效果很好。

下面是一个如何设置它的例子:

 // in Interface Builder set the class of your top view controller view to this @IBDesignable class DesignableView: UIView { } extension UIView { open override func prepareForInterfaceBuilder() { subviews.forEach { $0.prepareForInterfaceBuilder() } } } extension UILabel { // just an example of doing something open override func prepareForInterfaceBuilder() { layer.cornerRadius = 8 layer.masksToBounds = true backgroundColor = .red textColor = .green } } 

我能够使它与下面的代码一起工作,但副作用是故事板中的IB代理程序有时崩溃,因为它必须刷新太多的UI元素。 重新启动Xcode会暂时修复问题,直到下一次崩溃。 也许这就是OP面临的问题

 @IBDesignable extension UIView { @IBInspectable public var cornerRadius: CGFloat { set (radius) { self.layer.cornerRadius = radius self.layer.masksToBounds = radius > 0 } get { return self.layer.cornerRadius } } @IBInspectable public var borderWidth: CGFloat { set (borderWidth) { self.layer.borderWidth = borderWidth } get { return self.layer.borderWidth } } @IBInspectable public var borderColor:UIColor? { set (color) { self.layer.borderColor = color?.cgColor } get { if let color = self.layer.borderColor { return UIColor(cgColor: color) } else { return nil } } } } 

这就是为什么我试图添加where子句来减less应扩展此function的子类: genericsIBDesginables UIView扩展

这个代码块对我来说很好。

 import UIKit public extension UIView { @IBInspectable public var cornerRadius: CGFloat { get { return layer.cornerRadius } set { layer.cornerRadius = newValue layer.masksToBounds = newValue > 0 } } } 

注意从框架导入时可能不起作用。 我正试图找出原因。