ios – 将UITextViews文本替换为归因的字符串

前端之家收集整理的这篇文章主要介绍了ios – 将UITextViews文本替换为归因的字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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;
}

猜你在找的iOS相关文章