为什么 NSMutableAttributedString 在某些情况下会忽略背景色属性?

Why does NSMutableAttributedString ignore the background color attribute in certain cases?

我 运行 遇到了一个令人沮丧的问题。我想要一个标签来显示文本字符串,其中部分字符串具有不同的背景颜色。

此代码有效:

let s = NSMutableAttributedString(string: "test me bar", attributes: [:])
s.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(),
   range: NSMakeRange(4, 2))
s.addAttribute(NSBackgroundColorAttributeName, value: UIColor.blueColor(), 
   range: NSMakeRange(8, 2))

self.detailDescriptionLabel.attributedText = s

但是,如果我恰好删除了对 addAttribute 的其中一个调用(哪个无关紧要),以便我指定字符串的一个范围以具有背景颜色属性,则没有背景颜色显示在字符串中的任何位置。

我在 iOS 8.1 上,这发生在模拟器和我的 iPhone 6 上。我在我的代码中发现了这个问题,并仅使用上面的代码片段在一个空的项目。

有什么想法吗?我在这里拔头发。这是该问题的精简版,但对于我的项目而言,能够拥有只有一个区域具有背景色的字符串很重要。

EDIT 如果我将其中一种背景颜色设置为 UIColor.clearColor(),那么一切都会按预期工作。我可能在看 UIKit 中的错误吗?

您首先需要NSBackgroundColorAttributeName在整个文本中应用透明颜色。

[s addAttribute:NSBackgroundColorAttributeName value:[UIColor clearColor] range:(NSRange){0, s.length}];

然后你可以应用第二种颜色,你想要突出显示的文本范围。

[s addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:(NSRange){0, 2}];

对于Swift

mutableAttributedString.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.clear , range: {0, 2})

mutableAttributedString.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.yellow , range: {0, 2})

这也是您的错误:

只需这样做:

self.detailDescriptionLabel.numberOfLines = 2; // <---

你的问题就解决了。