背景
したがって、iOS 6では、UITextViewは構文の強調表示に役立つattributedStringをとることができます。UITextView attributedTextと構文の強調表示
-textView:shouldChangeTextInRange:replacementText:
でいくつかの正規表現パターンを実行していますが、すでに入力した単語の色を変更する必要があることがよくあります。 attributedTextをリセットする以外の方法はありませんが、これには時間がかかります。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
//A context will allow us to not call -attributedText on the textView, which is slow.
//Keep context up to date
[self.context replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:self.textView.typingAttributes]];
// […]
self.textView.scrollEnabled = FALSE;
[self.context setAttributes:self.defaultStyle range:NSMakeRange(0, self.context.length)];
[self refresh]; //Runs regex-patterns in the context
textView.attributedText = self.context;
self.textView.selectedRange = NSMakeRange(range.location + text.length, 0);
self.textView.scrollEnabled = TRUE;
return FALSE;
}
これは、シミュレータ上でokayish実行されますが、iPadの3にそれぞれ-setAttributedText
は数百ミリ秒かかります。
私は、Appleに、attributedTextの変更を要求するバグを提出しました。それは重複としてマークされているので、私は彼らがこれについて何を言っているか見ることができません。
質問
、より具体的な質問: はどのように私はすべてのshouldReplaceText...
でそれを行うには良い十分なパフォーマンスで、大規模なマルチカラーのテキストと、UITextViewに特定の範囲の色を変更できますか?
より幅広い質問: iOS 6のUITextViewで構文ハイライトを使用するにはどうすればよいですか?
:ここ
は便利なカテゴリです。私はiOS6で簡単にやることができると思っていましたが、動的に特定の範囲で文字列の色を変更するAPIは見つかりませんでした。 –
私はAppleにバグレポートを提出しました。この方法のようなものが必要です。 "textView_.attributedText addAttribute:value:font range:" –
はい、文字列が変更されるたびにtextViewが知る必要があるので、私はattributedTextの変更可能なバージョンを見ることはないでしょう。よりスマートなセッター、またはUITextInputの帰属バージョンである-replaceRange:withText: ' –