3

NSAttributedStringiOS アプリには単純なマークアップ パーサーがあります。このパーサーは、HTML のようなタグを含むテキストを取得し、各文字を反復処理してNSStringを生成することで に変換しNSMutableAttributedStringます。

文字列を反復処理するときにすべての文字に新しい属性セットを追加するという最悪のシナリオではNSMutableAttributedString、同一の隣接する属性範囲を結合して最適化するのに十分なほどインテリジェントでしょうか? それとも、Core Text でのレンダリングが非常に非効率的で遅いのでしょうか?

これが一般的に優れたアルゴリズムであると示唆しているわけではありません! 私は最悪のシナリオを見ているだけでNSMutableAttributedString、インテリジェントな動作が組み込まれているかどうか疑問に思っていますか?

4

1 に答える 1

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)];

つまり、2 つの太字の属性を隣り合わせに追加しました。次に、結果を表示しました。

NSLog(@"%@", text);

出力には、通常のフォントの「Test」、太字の「foobar」、通常のフォントの「hey」の 3 つのテキストのチャンクが表示されました。

あなたの質問に答えるために、はい、NSMutableAttributedString で 2 つの隣接する書式設定範囲が自動的に結合されたようです。

PS 関連する注意事項として、改行をまたがる範囲の属性を適用すると、結果の NSAttributedString には改行の前に 1 つの属性があり、改行の後に別の属性があり、改行自体にはありません。任意の属性。そのため、一度に 1 文字ずつ解析する場合は、それを補正する必要があるかもしれません。

于 2013-05-15T12:23:05.643 に答える