lineSpacing 是 UILabel 的 属性 吗?

Is lineSpacing a property of UILabel?

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

var lineSpacing = CGFloat(20.0)

当我在这里使用它时,它会向上推文本,即使它没有用于任何用途,我删除了除 属性:

之外的所有代码
class CustomLabel : UILabel {
    var lineSpacing = CGFloat(20.0)
}

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

regularLabel.lineSpacing

报错。

是的,UILabel 有一个未记录的、非 public lineSpacing 属性。您可以在从运行时 Objective-C 元数据创建的这个头文件中看到它:

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UILabel.h

因为它不是 public,如果您将其提交到 App Store,覆盖它(即使是意外地)可能会导致 Apple 拒绝您的应用程序。

而不是实现你自己的行间距代码(或者如果你真的想覆盖那个属性),你可以通过创建一个暴露[=17的协议来使用内置的私有属性 =]:

@objc protocol UILabelPrivate {
    var lineSpacing: Int {get set}
}

let label = UILabel()
let privateLabel = unsafeBitCast(label, UILabelPrivate.self)

privateLabel.lineSpacing = 2

label.valueForKey("lineSpacing") // 2

这有效地创建了一个 "interface" 公开通常私有的 lineSpacing 属性.