Swift IBDesignables和字符间距(字距调整)

时间:2018-06-29 08:29:38

标签: swift ibdesignable kerning

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

但是,花了几个小时未能找到替代方案,我希望有人能够提供建议或朝着正确的方向推进。

1 个答案:

答案 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
    }
}