我可以通过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) {}
但是,花了几个小时未能找到替代方案,我希望有人能够提供建议或朝着正确的方向推进。
答案 0 :(得分:1)
我认为正确的方法是无论从何处(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
}
}