大型属性字符串的 UITextView 滚动性能

UITextView scroll performance for large attributed strings

如何在使用属性字符串时提高 UITextView 的滚动性能?以下示例代码在 iPad 3.

上导致完全无法接受的性能
NSMutableParagraphStyle *pStyle = [[NSMutableParagraphStyle alloc] init];
pStyle.lineSpacing = 14.0;
pStyle.lineHeightMultiple = 20;
pStyle.maximumLineHeight = 20.0;
pStyle.minimumLineHeight = 20.0;
UIFont *font = [UIFont systemFontOfSize:20.0];
NSDictionary *attributes = @{ NSFontAttributeName : font, NSParagraphStyleAttributeName : pStyle};

NSMutableAttributedString *newline = [[NSMutableAttributedString alloc] initWithString:@"\n\n"];
NSMutableAttributedString *string  = [[NSMutableAttributedString alloc] initWithString:@"" attributes:@{}];

for (int paragraph=0; paragraph<300; paragraph++){
    for (int word=0; word<100; word++){
        [string appendAttributedString:[[NSAttributedString alloc] initWithString:@"text!"]];
    }
    [string appendAttributedString:newline];
}

[string setAttributes:attributes range:NSMakeRange(0, string.length)];

self.textView.attributedText = string;

我应该提一下,我对使用 Text Kit 持开放态度,但我不知道从哪里开始才能确保性能最终没问题。此外,以下是滚动时探查器中发生的情况。

这里有两点帮助。

  1. 首先,我只需要 lineSpacing 样式集。设置任何其他段落参数都会导致滚动缓慢。

  2. 第二个是在viewDidAppear:中调用[self.textView.layoutManager ensureLayoutForCharacterRange:NSMakeRange(0, self.textView.attributedText.length)];。否则第一次滚动浏览文档时会出现卡顿。