NSAttributedString在字符串末尾更改颜色

时间:2013-10-01 18:39:41

标签: ios colors nsattributedstring

这一定很容易,但我无法理解。

我有一个NSMutableAttributedString,例如,“这是一个测试”。我想给“测试”蓝色这个颜色上色,我用它来做:

NSMutableAttributedString *coloredText = [[NSMutableAttributedString alloc] initWithString:@"This is a test"];

[coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(10,4)];

这很好用。但是现在我想在“test”之后输入的任何内容都将文本颜色设置为黑色。

如果我这样做:

[coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(coloredText.string.length, 1)];

我得到一个objectAtIndex:effectiveRange:越界错误。假设因为范围超出了字符串的长度。

如果我这样做:

[coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(coloredText.string.length, 0)];

错误消失但在“测试”一词后面输入仍为蓝色。

当插入点位于字符串末尾时,如何设置插入点的当前颜色?

为任何输入欢呼。

2 个答案:

答案 0 :(得分:6)

如果其他人偶然发现了这个问题,我想发布用于解决问题的代码。我最终使用了卡米尔的建议并添加了:

NSAttributedString *selectedString = [textView.attributedText attributedSubstringFromRange:NSMakeRange(textView.attributedText.string.length - 1, 1)];
    __block BOOL isBlue = NO;

    [selectedString enumerateAttributesInRange:NSMakeRange(0, [selectedString length]) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(NSDictionary *attributes, NSRange range, BOOL *stop) {
        isBlue = [[attributes objectForKey:NSForegroundColorAttributeName] isEqual:[UIColor blueColor]];
    }];

    if (isBlue) {
        NSMutableAttributedString *coloredText = [[NSMutableAttributedString alloc] initWithAttributedString:textView.attributedText];
        [coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(textView.attributedText.string.length - 1, 1)];
        textView.attributedText = coloredText;
    }

到文本更改处理程序。

答案 1 :(得分:1)

如果文本发生变化,您需要重新计算属性,因为它们的有效范围不会随着文本的长度自动变化。