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
属性.
我有一个 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
属性.