UITextView属性文本和语法高亮显示 背景

UITextView属性文本和语法高亮显示 背景,uitextview,syntax-highlighting,ios6,nsattributedstring,uitextviewdelegate,Uitextview,Syntax Highlighting,Ios6,Nsattributedstring,Uitextviewdelegate,因此,在iOS 6中,UITextView可以采用attributedString,这对于语法突出显示非常有用 我在-textView:shouldChangeTextInRange:replacementText:中执行一些正则表达式模式,并且经常需要更改已键入单词的颜色。除了重置AttributeText,我看不到其他选项,这需要时间 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range

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

我在
-textView:shouldChangeTextInRange:replacementText:
中执行一些正则表达式模式,并且经常需要更改已键入单词的颜色。除了重置AttributeText,我看不到其他选项,这需要时间

- (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;
}
这在模拟器上可以运行,但在iPad3上,每个
-setAttributeText
都需要几百毫秒

我向苹果公司提交了一个bug,请求能够修改AttributeText。它被标记为复制品,所以我看不出他们在说什么

问题 更具体的问题: 如何在UITextView中更改某些区域的颜色,使用大量多色文本,并且性能足够好,可以在每个
shouldReplaceText…
中进行更改

更广泛的问题:
如何在iOS 6中使用UITextView进行语法高亮显示?

attributedText访问器必须往返于HTML,因此对于语法高亮显示的文本视图实现来说,这确实不是最佳选择。在iOS 6上,您可能希望直接使用CoreText。

我的应用程序Zap Guitar(没有附加字符串)也遇到了同样的问题,我允许用户键入/粘贴/编辑自己的歌曲,应用程序突出显示识别的和弦

是的,苹果确实使用html编写器和解析器来显示属性文本。关于幕后的精彩解释可以在这里找到:

对于这个问题,我找到的唯一解决方案是不使用属性文本,这对于语法突出显示来说是一种过分的做法

取而代之的是,我使用纯文本恢复到良好的旧UITextView,并在需要高亮显示的文本视图中添加了按钮。为了计算按钮帧,我使用了以下答案:

这将CPU使用率降低了30%(不分大小)

以下是一个方便的类别:

@implementation UITextView (WithButtons)
- (CGRect)frameForTextRange:(NSRange)range {
    UITextPosition *beginning = self.beginningOfDocument;
    UITextPosition *start = [self positionFromPosition:beginning offset:range.location];
    UITextPosition *end = [self positionFromPosition:start offset:range.length];
    UITextRange *textRange = [self textRangeFromPosition:start toPosition:end];
    CGRect rect = [self firstRectForRange:textRange];
    return [self convertRect:rect fromView:self.textInputView];
}

@end

我还试图突出显示我的网络扬声器应用程序中所说的文本。我以为我可以用iOS6轻松地完成这项工作,但我找不到在特定范围内动态更改字符串颜色的api。。每次设置全属性文本都会花费太多时间。我还向苹果提交了一份错误报告。我们需要这样的方法。“textView\uu.attributedText addAttribute:value:font range:”是的,但我打赌我们永远不会看到attributedText的可变版本,因为textView需要知道字符串何时更改。我希望能有一个更智能的setter,或者一个uiteDisput的
-replaceRange:withText:
的属性化版本。听起来不错,我们现在只能将nsstring设置为“withText”,所以希望苹果会改变它。如果文本样式纯粹是装饰性的,您可能不必每次用户键入内容时都更新整个文本视图。例如,您可以使用NSTimer每0.5秒更新一次属性文本。我不知道textView的HTML是如何工作的,但是您可以很容易地更改属性,就像替换DOM中的一些文本并更新textView的文本一样,不是吗?