应用其他属性时,NSAttributedString 背景颜色不纯

NSAttributedString background color is not solid when other attributes are applied

我想使用 NSAttributedString:

UILabel 文本样式进行几处更改
  1. 部分字符串必须实心backgroundColor;
  2. 字符串的某些部分必须有不同的 font;
  3. 字符串的某些部分必须有不同的 foregroundColor;

但是当我进行这些更改时,我 运行 发现 backgroundColor 在(我认为)其他属性(font 之间有一些间距(图像中的垂直线) /foregroundColor).

(参见full size image)

我该如何解决?

Swift游乐场代码:

import PlaygroundSupport
import UIKit

let label = UILabel()
label.backgroundColor = .black
let text = "Hello + World!"
let nsText = NSString(string: text)

let attributedString = NSMutableAttributedString(string: text)

attributedString.addAttribute(.backgroundColor, value: UIColor.systemCyan, range: nsText.range(of: "Hello + Wo"))

attributedString.addAttribute(.font, value: UIFont.systemFont(ofSize: 100.0), range: nsText.range(of: "Hello"))

attributedString.addAttribute(.foregroundColor, value: UIColor.systemPurple, range: nsText.range(of: " + "))
attributedString.addAttribute(.font, value: UIFont.systemFont(ofSize: 80.0), range: nsText.range(of: " + "))

attributedString.addAttribute(.foregroundColor, value: UIColor.white, range: nsText.range(of: "World!"))
attributedString.addAttribute(.font, value: UIFont.systemFont(ofSize: 44.0), range: nsText.range(of: "World!"))

label.attributedText = attributedString
label.sizeToFit()

PlaygroundPage.current.liveView = label

有一个名为 expansion 的属性可以使用浮点值调整字体的扩展系数。该问题仅发生在具有不同字体大小的两个范围相遇时,这是一个无法覆盖的图形渲染问题。但是,如果您明确地将扩展因子归零,或者甚至应用一个小的负值,差距将不会很明显。

attributedString.addAttribute(.expansion, value: NSNumber(value: 0), range: nsText.range(of: "Hello + World!"))

https://developer.apple.com/documentation/foundation/nsattributedstring/key/1524652-expansion?language=objc__5