lineSpacing是UILabel的属性吗?

时间:2016-06-08 18:00:41

标签: swift uilabel subclass

我有一个UILabel的子类,其属性lineSpacing设置如下:

var lineSpacing = CGFloat(20.0)

当我在这里使用它时,它会推送文本,即使它没有用于任何内容,我删除了除该属性之外的所有代码:

class CustomLabel : UILabel {
    var lineSpacing = CGFloat(20.0)
}

并且它仍然被推高,我更改了属性的名称并修复了它,我只是想知道它来自哪里,因为我无法从lineSpacing <访问UILabel / p>

regularLabel.lineSpacing

给出错误。

2 个答案:

答案 0 :(得分:5)

是的,UILabel有一个无证件的非公开lineSpacing属性。您可以在此头文件中看到它是从运行时Objective-C元数据创建的:

Map documentation

由于它不公开,如果您将其提交到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属性。