Swift IBDesignables и интервал между символами (кернинг) - PullRequest
0 голосов
/ 29 июня 2018

Я могу успешно реализовать вариант следующего кода (/ function) с помощью 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 голосов
/ 29 июня 2018

Я думаю, что правильный способ - установить 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
    }
}
...