设置 NSAttributed 字符串属性会覆盖子字符串属性 [英] setting NSAttributed String attribute overrides substring attributes
问题描述
我创建了一个可变字符串,看起来像@"testMeIn:greenColor:Different:greencolor:Colors"
I have created a mutable string which will look like @"testMeIn:greenColor:Different:greencolor:Colors"
NSMutableAttributedString *mutableText = [[NSMutableAttributedString alloc] initWithAttributedString:myString];
UIColor *foregroundColor = [UIColor blackColor];
NSString *key = NSForegroundColorAttributeName;
[mutableText addAttribute:key value:foregroundColor range:NSMakeRange(0, myString.length)];
当我添加属性 foregroundColor 时,子字符串中现有的绿色被指定的黑色覆盖.虽然我可以更改代码以设置子字符串的绿色,但我想知道是否还有其他方法可以将样式应用于没有样式的字符串部分而不覆盖现有样式.
When I add Attribute foregroundColor , the existing green color in substring gets overridden by the specified black color. Though I can change the code to set the green color for substring, I would like to know is there any other way of applying styles to the part of Strings which doesn't have styles without overriding the existing styles.
推荐答案
您可以枚举字符串中的每个属性跨度,并且仅在属性尚未设置时更改属性
You can enumerate over each attribute span in the string, and only change attributes if they are not already set
NSMutableAttributedString* aString =
[[NSMutableAttributedString alloc] initWithString:@"testMeIn DIFFERENT Colors"];
[aString setAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}
range:(NSRange){9,9}];
[aString enumerateAttributesInRange:(NSRange){0,aString.length}
options:nil
usingBlock:
^(NSDictionary* attrs, NSRange range, BOOL *stop) {
//unspecific: don't change text color if ANY attributes are set
if ([[attrs allKeys] count]==0)
[aString addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:range];
//specific: don't change text color if text color attribute is already set
if (![[attrs allKeys] containsObject:NSForegroundColorAttributeName])
[aString addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:range];
}];
这篇关于设置 NSAttributed 字符串属性会覆盖子字符串属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!