Zastąp tekst UITextViews przypisanym łańcuchem

mamUITextView a gdy użytkownik wprowadza do niego tekst, chcę sformatować tekst w locie. Coś w rodzaju podświetlania składni ...

Do tego chciałbym użyćUITextView...

Wszystko działa dobrze spodziewaj się jednego problemu: biorę tekst z widoku tekstu i robięNSAttributedString z tego. Wprowadzam kilka zmian do tego przypisanego ciągu i przywracam go jakotextView.attributedText.

Dzieje się tak za każdym razem, gdy użytkownik wpisze. Muszę więc pamiętać oselectedTextRange przed edycją doattributedText i ustaw go później, aby użytkownik mógł kontynuować pisanie w miejscu, które wcześniej pisał. Jedynym problemem jest to, że gdy tekst jest wystarczająco długi, aby wymagać przewijania,UITextView zacznie się przewijać do góry, jeśli będę pisać powoli.

Oto przykładowy kod:

- (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;
}

Czy istnieje rozwiązanie bez użycia CoreText bezpośrednio? LubięUITextViewmożliwość wybrania tekstu i tak dalej ....

questionAnswers(4)

yourAnswerToTheQuestion