gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 14:33:22 25 4
gpt4 key购买 nike

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

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

最佳答案

我认为正确的方法是在 spacing/text 改变时设置 kern,无论从哪里(storyboard 或 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
}
}

关于Swift IBDesignables 和字符间距(字距调整),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51097433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com