Sfondo
Così, con iOS 6 un'UITextView può assumere un attributedString, che potrebbe essere utile per evidenziare la sintassi.UITextView attributedText e l'evidenziazione della sintassi
Sto facendo alcuni schemi di espressioni regolari in -textView:shouldChangeTextInRange:replacementText:
e spesso ho bisogno di cambiare il colore di una parola già digitata. Non vedo altre opzioni che resettare il testo attribuito, che richiede tempo.
- (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;
}
Questo viene eseguito okayish sul simulatore, ma su un iPad 3 ciascuno -setAttributedText
prende un paio di centinaia di millisecondi.
Ho archiviato un bug su Apple, con la richiesta di poter modificare il testo attribuito. È stato contrassegnato come duplicato, quindi non riesco a vedere cosa stanno dicendo su questo.
La domanda
La domanda più specifica: Come posso cambiare il colore di alcune gamme in un UITextView, con un testo di grandi dimensioni multicolore, con buone prestazioni abbastanza da fare in ogni shouldReplaceText...
?
La domanda più ampia: Come si esegue l'evidenziazione della sintassi con un UITextView in iOS 6?
Sto anche cercando di evidenziare il testo che viene parlato in mio diffusore web app. Ho pensato che sarei stato in grado di farlo facilmente con iOS6, ma non sono riuscito a trovare l'api per modificare dinamicamente il colore delle corde in determinati intervalli. L'impostazione di testo attribuito completo ogni volta richiede troppo tempo. –
Ho anche presentato una segnalazione di bug ad Apple. Abbiamo bisogno di qualcosa come questo metodo. "textView_.attributedText addAttribute: valore: intervallo di caratteri:" –
Sì, ma scommetto che non vedremo mai una versione mutabile del testo attribuito, dal momento che textView deve sapere ogni volta che la stringa viene cambiata. Spero sia per un setter più intelligente, sia per una versione attribuita di '-replaceRange: withText:' –