我有一个UILabel的子类,其属性lineSpacing
设置如下:
var lineSpacing = CGFloat(20.0)
当我在这里使用它时,它会推送文本,即使它没有用于任何内容,我删除了除该属性之外的所有代码:
class CustomLabel : UILabel {
var lineSpacing = CGFloat(20.0)
}
并且它仍然被推高,我更改了属性的名称并修复了它,我只是想知道它来自哪里,因为我无法从lineSpacing
<访问UILabel
/ p>
regularLabel.lineSpacing
给出错误。
答案 0 :(得分:5)
是的,UILabel
有一个无证件的非公开lineSpacing
属性。您可以在此头文件中看到它是从运行时Objective-C元数据创建的:
由于它不公开,如果您将其提交到App Store,则覆盖它(甚至意外)可能会导致Apple拒绝您的应用。
答案 1 :(得分:1)
您可以通过创建公开属性的协议来使用内置的私有属性,而不是实现自己的行间距代码(或者如果您真的想要覆盖该属性):
@objc protocol UILabelPrivate {
var lineSpacing: Int {get set}
}
let label = UILabel()
let privateLabel = unsafeBitCast(label, UILabelPrivate.self)
privateLabel.lineSpacing = 2
label.valueForKey("lineSpacing") // 2
这有效地创建了一个“接口”,暴露了正常的私有lineSpacing
属性。