【问题标题】:How to set both spacing between characters (kern) and strikethrough style for `UILabel`?如何为`UILabel`设置字符之间的间距(kern)和删除线样式?
【发布时间】:2018-02-16 16:42:00
【问题描述】:

我需要为UILabel 呈现的文本设置两个属性:字母之间的间距(kern)及其删除线样式。基于NSAttributedStringKey 文档,我为UILabel 创建了以下扩展:

extension UILabel {
    func setStrikeThroughSpacedText(text: String, kern: CGFloat?) {
        var attributes: [NSAttributedStringKey : Any] = [:]
        if let kern = kern {
            attributes[.kern] = kern
        }
        attributes[.strikethroughStyle] 
                  = NSNumber(integerLiteral: NSUnderlineStyle.styleSingle.rawValue)
        self.attributedText = NSAttributedString(string: text,
                                                 attributes: attributes)
    }
}

但是,.kern 键似乎以某种方式与 .strikethroughStyle 键发生冲突,因为如果我指定 kern,则会应用 kern,但不会应用删除线样式。如果我不指定 kern(因此扩展不应用 .kern 属性),删除线样式有效。

任何人都有不同的方法来解决这个错误(我认为这是一个错误)?

【问题讨论】:

  • 这确实看起来像一个错误。你提交雷达了吗?
  • 还没有……虽然我刚刚在 iOS 11 上的模拟器中对其进行了测试,但它似乎在那里工作……所以他们似乎在那里修复了它……
  • 查看更新后的结果。

标签: ios swift ios10 swift4 nsattributedstring


【解决方案1】:

试试这个,它应该适合你
注意:我在 Swift 4

中进行了测试
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
let style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.count))
attrString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: 2, range: NSMakeRange(0, attrString.length))
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))
label.attributedText = attrString


结果:
模拟人生 1:罢工 + LineSpacing
模拟 2:Strike + LineSpacing + 字符间距

【讨论】:

  • .kern 属性设置字符间距,而不是行间距
  • 尝试使用 Xcode 9 (Swift 4) 和 iOS 10 模拟器。 (您可能将 Xcode 8 与 Swift 3 一起使用)
  • 我正在使用 XCode 9 beta、swift 4 和 iOS 10 设备
  • 但是我不接受你的回答,如果它在 iOS 11 上正常运行,对我来说在 iOS 10 上运行它并不是那么重要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多