我希望能够在界面构建器中设置自定义控件的标题,并将标题实现为UILabel。我创建了我的属性:
@IBInspectable var titleText: String? {
get {
return title.text
}
set(newTitleText) {
title.text = newTitleText
}
}
@IBInspectable lazy var title: UILabel = UILabel.init()
这是一个很好/推荐的方法吗?如果标题文本已经设置并且计划通过覆盖layoutSubviews
来计划执行此操作,我还希望控件布局UILabel - 这是推荐的还是你会建议不同的模式吗?
我的最终目标是能够让设计师从IB配置我的控件,并将UILabel暴露为可以在IB中配置的属性,这将是我的理想。
答案 0 :(得分:1)
@IBInspectable
只能用于以下类型:
Int
CGFloat
Double
String
Bool
CGPoint
CGSize
CGRect
UIColor
UIImage
所以,不,你不能“暴露UILabel
”进行设计时操作。
答案 1 :(得分:1)
首先,我认为你不需要在这里创建变量lazy
,如果你想创建一个新的UILabel实例,最好使用构造函数UILabel()
。 / p>
现在,我不确定我是否正确理解了您的问题,但如果我这样做了,那么您可以将自定义视图属性(例如代表您的标题标签的字符串)公开给属性检查员。
你会这样做:
@IBDesignable
class CustomView: UIView {
@IBOutlet weak var titleLabel: UILabel!
@IBInspectable var title: String? {
didSet { self.titleLabel.text = title }
}
}
打破上面的代码:
首先,您创建类(自定义视图)@IBDesignable
,以便它支持Interface Builder中的实时预览。
然后,在自定义视图类中,创建一个title属性(String
),并确保将其设为@IBInspectable
,以便稍后可以通过Attributes Inspector更改此属性。
最后,添加属性观察器(didSet
),以便每当从Attributes Inspector更改title属性时,都会更新自定义标签的text属性。