6

背景

したがって、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で構文ハイライトを使用するにはどうすればよいですか?

+0

:ここ

は便利なカテゴリです。私はiOS6で簡単にやることができると思っていましたが、動的に特定の範囲で文字列の色を変更するAPIは見つかりませんでした。 –

+0

私はAppleにバグレポートを提出しました。この方法のようなものが必要です。 "textView_.attributedText addAttribute:value:font range:" –

+0

はい、文字列が変更されるたびにtextViewが知る必要があるので、私はattributedTextの変更可能なバージョンを見ることはないでしょう。よりスマートなセッター、またはUITextInputの帰属バージョンである-replaceRange:withText: ' –

答えて

0

attributedTextアクセサはHTMLとの間で往復する必要があるため、構文強調表示されたテキストビューの実装では実際には最適ではありません。 iOS 6では、おそらくCoreTextを直接使用したいと思うでしょう。

+0

textViewのHTMLがどのように機能しているか正確には分かりませんが、DOM内のテキストを置き換えてtextViewのテキストを更新するのと同じくらい簡単に属性を変更できますか? –

1

私のアプリケーションで同じ問題が発生しました.Zap-Guitar(No-Strings-Attached)では、ユーザーが自分の曲をタイプ/ペースト/編集できるようになり、アプリは認識されたコードを強調表示します。

はいtrue appleはhtmlライターとパーサーを使用して帰属テキストを表示します。シーンの背後にある素晴らしい説明は、ここで見つけることができます:http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

この問題で私が見つけた唯一の解決策は、構文ハイライトの過剰な属性テキストを使用しないことです。

代わりに、プレーンテキストの良い古いUITextViewに戻り、強調表示が必要なテキストビューにボタンを追加しました。ボタンのフレームを計算するには、私はこの答えを使用しました:How to find position or get rect of any word in textview and place buttons over that?

これは、CPU使用量を30%削減しました。私はまた私のウェブスピーカーアプリで話されているテキストを強調しようとしています

@implementation UITextView (WithButtons) 
- (CGRect)frameForTextRange:(NSRange)range { 
    UITextPosition *beginning = self.beginningOfDocument; 
    UITextPosition *start = [self positionFromPosition:beginning offset:range.location]; 
    UITextPosition *end = [self positionFromPosition:start offset:range.length]; 
    UITextRange *textRange = [self textRangeFromPosition:start toPosition:end]; 
    CGRect rect = [self firstRectForRange:textRange]; 
    return [self convertRect:rect fromView:self.textInputView]; 
} 

@end 
関連する問題