你可以使用类别/扩展将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 } } }
注意从框架导入时可能不起作用。 我正试图找出原因。
- UITextView在故事板中的本地化
- iOS预生成操作,根据Scheme更改plist值
- 在xib中分配的图像是否caching?
- 只有在添加第三个segue时,prepareForSegue才调用didSelectRowAtIndexPath
- Xcode 4和Interface Builder:编辑垂直间距约束(Anchor Top,而不是Bottom)
- 为什么我的视图不能在Storyboard中显示,并在左侧窗格中显示为灰色?
- XcodeのRun Scriptフェーズを无效にしてビルド时间を短缩する(スクリプト付き)
- 为什么不能使用界面生成器使用UIView的一个具体的通用子类?
- Xcode中有2个第三方库的重复符号问题