【问题标题】:Swift IBDesignables and character spacing (kerning)Swift IBDesignables 和字符间距(紧缩)
【发布时间】:2018-06-29 08:29:38
【问题描述】:

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

但是,我花了几个小时寻找替代方案但没有成功,我希望有人能够提供建议,或者朝着正确的方向前进。

【问题讨论】:

  • 问题或问题是什么?
  • @Willeke 在按照上述方式实施时没有任何效果,我希望就如何更好地处理/修复任务提供一些提示/建议。

标签: swift ibdesignable kerning


【解决方案1】:

我认为正确的方法是设置kern,无论从哪里更改spacing/textstoryboard or code)。如果您从 storyboard 更改某些内容,draw 方法将不会执行,因此您不会看到任何更改。以下是实现目标的正确方法。

@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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多