我们的iOS应用程序中有一个简单的标记解析器,它使用类似HTML的标记文本,并通过迭代简单NSAttributedString
中的每个字符并生成{{1}将其转换为NSString
}}
在最糟糕的情况下,我们在迭代字符串时为每个字符添加了一组新属性,NSMutableAttributedString
是否足够智能以将相同的相邻属性范围连接在一起并进行优化?或者在Core Text中呈现效率是否非常低效且速度慢?
我并不是说这是一个很好的算法!我只是在看最糟糕的情况,并想知道NSMutableAttributedString
是否有任何内置的智能行为?
答案 0 :(得分:3)
我刚试过这样的东西(我真实代码的简化版):
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"Testfoobarhey"];
UIFont *font = [UIFont fontWithName:@"Georgia-Bold" size:12.0];
[text addAttribute:NSFontAttributeName value:font range:NSMakeRange(4, 3)];
[text addAttribute:NSFontAttributeName value:font range:NSMakeRange(7, 3)];
换句话说,我在彼此旁边添加了两个粗体属性。然后我查看了结果:
NSLog(@"%@", text);
输出显示三个文本块:正常字体中的“Test”,粗体中的“foobar”和普通字体中的“hey”。
所以回答你的问题,是的,看起来两个相邻的格式化范围在NSMutableAttributedString中自动连接。
P.S。在一个相关的说明中,我注意到如果我应用一个范围延伸到换行符的属性,生成的NSAttributedString将在换行符之前有一个属性,而另一个属性之后,换行符本身将没有任何属性属性。因此,如果您一次解析一个字符,则可能需要对此进行补偿。