对 SKLabelNode 文本的某些部分应用不同的颜色

Applying different colors to certain parts of SKLabelNode's text

我非常确定不能使用 NSMutableAttributedStringNSAttributedString。我试过的是:

 NSMutableAttributedString * newString = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
    [newString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
    [newString addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
    [newString addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];

labelNode.text = [newString string];

这不起作用,文本仍然是原来的颜色。有什么办法可以用 SKLabelNode 做到这一点吗?使用多个 SKLabelNodes 是解决方案,但我不能说它很优雅(或性能)。

SKLabelNode 不支持 NSAttributedStringNSMutableAttributedString。当您使用 labelNode.text = [newString string] 时,您只是获取了属性字符串的文本部分,而忽略了您在前几行中所做的所有更改。

我在 GitHub 上发现了一些您可能感兴趣的内容。它在 Swift 但代码很短,应该很容易理解。

ASAttributedLabelNode

自 iOS11 起,SKLabelNode 支持 NSAttributedStrings,因此不再需要 ASAttributedLabelNode。您的代码如下所示:

NSMutableAttributedString * newString = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
    [newString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
    [newString addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
    [newString addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];

labelNode.attributedText = newString;

在Swift 4:

let newString = NSMutableAttributedString(string: "firstsecondthird")

newString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: NSMakeRange(0,5))
newString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.green, range: NSMakeRange(5,6))
newString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.blue, range: NSMakeRange(11,5))

labelNode.attributedText = newString