我可以通过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
    }
}

08-27 19:41
查看更多