大型属性字符串的 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 持开放态度,但我不知道从哪里开始才能确保性能最终没问题。此外,以下是滚动时探查器中发生的情况。
这里有两点帮助。
首先,我只需要 lineSpacing
样式集。设置任何其他段落参数都会导致滚动缓慢。
第二个是在viewDidAppear:
中调用[self.textView.layoutManager ensureLayoutForCharacterRange:NSMakeRange(0, self.textView.attributedText.length)];
。否则第一次滚动浏览文档时会出现卡顿。
如何在使用属性字符串时提高 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 持开放态度,但我不知道从哪里开始才能确保性能最终没问题。此外,以下是滚动时探查器中发生的情况。
这里有两点帮助。
首先,我只需要
lineSpacing
样式集。设置任何其他段落参数都会导致滚动缓慢。第二个是在
viewDidAppear:
中调用[self.textView.layoutManager ensureLayoutForCharacterRange:NSMakeRange(0, self.textView.attributedText.length)];
。否则第一次滚动浏览文档时会出现卡顿。