我可以通过viewDidLoad()在下面的代码(/函数)上成功地实现一个变体,但是,我想将它集成到IBDesignable中,如下所示。
@IBDesignable
class kernedLabel: UILabel {
@IBInspectable var spacing: CGFloat = 10.4
override func draw(_ rect: CGRect) {
changeSpacing()
}
func changeSpacing(){
let stringValue=text ?? ""
let attrString = NSMutableAttributedString(string: stringValue)
attrString.addAttribute(NSAttributedStringKey.kern, value: spacing, range: NSMakeRange(0, attrString.length))
self.attributedText=attrString
}
}
我几乎可以肯定,失败的原因是调用
override func draw(_ rect: CGRect) {}
然而,在花了数小时寻找替代品未果之后,我希望有人能够提供建议,或是朝着正确的方向努力。
最佳答案
我认为正确的方法是在kern
更改时设置spacing/text
,无论从何处(storyboard or code
)。如果您从draw
更改了某些内容,storyboard
方法将不会执行,因此您不会看到任何更改。以下是实现目标的正确方法。
@IBDesignable
class KernedLabel: UILabel {
@IBInspectable public var spacing: CGFloat = 0.0 {
didSet {
applyKerning()
}
}
override var text: String? {
didSet {
applyKerning()
}
}
private func applyKerning() {
let stringValue = self.text ?? ""
let attrString = NSMutableAttributedString(string: stringValue)
attrString.addAttribute(NSAttributedStringKey.kern, value: spacing, range: NSMakeRange(0, attrString.length))
self.attributedText = attrString
}
}