我有一个UITextView,当用户正在输入文本时,我想即时格式化文本.像语法突出显示…
为了我想使用UITextView …
一切正常工作都有一个问题:我从文本视图中取出文本,并从中创建一个NSAttributedString.我对这个归因的字符串进行了一些编辑,并将其设置为textView.attributedText.
每次用户键入时都会发生这种情况.所以我必须记住在编辑之前的selectedTextRange,然后将其重新设置,以便用户可以继续在他之前输入的地方打字.唯一的问题是,一旦文本足够长,需要滚动,如果我慢慢键入,UITextView现在将开始滚动到顶部.
以下是一些示例代码:
- (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; }
有没有直接使用CoreText的解决方案?我喜欢UITextViews能够选择文本等等….
解决方法
我不确定这是否是正确的解决方案,但它是有效的.
在格式化文本之前禁用滚动,并在格式化后启用它
在格式化文本之前禁用滚动,并在格式化后启用它
- (void)formatTextInTextView:(UITextView *)textView { textView.scrollEnabled = NO; NSRange selectedRange = textView.selectedRange; NSString *text = textView.text; // This will give me an attributedString with the base text-style NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: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; textView.scrollEnabled = YES; }