背景

因此,在iOS 6中,UITextView可以采用attributedString,这对于语法突出显示很有用。

我在-textView:shouldChangeTextInRange:replacementText:中做一些正则表达式模式,通常我需要更改已经键入的单词的颜色。除了重设attributedText,这没有其他选择,这需要花费时间。

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

这在模拟器上可以正常运行,但是在iPad 3上,每个-setAttributedText都需要花费几百毫秒的时间。

我向Apple提出了一个错误,要求能够对attributedText进行突变。它被标记为重复,所以我看不到他们在说什么。

问题

更具体的问题:
如何在带有大的彩色文本的UITextView中更改某些范围的颜色,并且具有足以在每个shouldReplaceText...中执行的性能?

更广泛的问题:
如何在iOS 6中使用UITextView突出显示语法?

最佳答案

attributedText访问器必须往返于HTML,因此对于语法突出显示的文本 View 实现而言,这并不是最佳选择。在iOS 6上,您可能需要直接使用CoreText。

关于UITextView attributedText和语法突出显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12543468/

10-13 01:32