Remplacer le texte UITextViews par une chaîne attribuée
J'ai un UITextView
et lorsque l'utilisateur d'entrer du texte, je veux formater le texte à la volée. Quelque chose comme la coloration syntaxique...
Pour cela je voudrais utiliser UITextView
...
Tout fonctionne bien s'attendre à un problème: je prends le texte de l'affichage de texte et de faire un NSAttributedString
de de lui. J'ai apporter quelques modifications à cette attribué chaîne et la définir comme la textView.attributedText
.
Cela se produit chaque fois que l'utilisateur tape. J'ai donc rappeler le selectedTextRange
avant de le modifier pour le attributedText
et le ramener par la suite, de sorte que l'utilisateur peut continuer à taper à l'endroit où il était avant de taper. Le seul problème est qu'une fois que le texte est assez long pour exiger le défilement, le UITextView
va maintenant démarrer le défilement vers le haut si je tape lentement.
Voici un exemple de code:
- (void)formatTextInTextView:(UITextView *)textView
{
NSRange selectedRange = textView.selectedRange;
NSString *text = textView.text;
//This will give me an attributedString with the base text-style
NSMutableAttributedString *attributedString = [self attributedStringFromString:text];
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error];
NSArray *matches = [regex matchesInString:text
options:0
range:NSMakeRange(0, text.length)];
for (NSTextCheckingResult *match in matches)
{
NSRange matchRange = [match rangeAtIndex:0];
[attributedString addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:matchRange];
}
textView.attributedText = attributedString;
textView.selectedRange = selectedRange;
}
Est-il une solution sans l'aide de CoreText directement? J'aime la UITextView
s possibilité de sélectionner du texte et ainsi de suite....
source d'informationauteur Georg
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que ce soit la bonne solution, mais il fonctionne.
Il suffit de désactiver le défilement avant le formatage du texte et de l'activer après le formatage
Utilisé Sergeys la réponse de moi-même et portés à Swift 2:
Swift 2.0: