我在NSTextView
中偶然发现了一种行为,这似乎不是故意的,或者至少我不明白背后的原因。
当您在NSTextView
中有大量文本并调整控件/窗口的大小时,单词的换行仅在文本在顶部附近滚动时在调整大小时流畅且立即发生。如果您在文本中向下滚动,它不会,并且在您发布并完成调整大小之前,它似乎不会"提交"换行。
是否存在一些内部限制,或者这是一个错误?
该问题似乎是可重现的:
macOS 10.15.4, Xcode 11.4.1
- 创建新的 macOS 应用程序项目
- 在默认生成的视图控制器上放置一个
NSTextView
(无论 3 个中的哪一个:富、纯或默认(并约束它,使其随窗口(顶部、底部、前导、尾随(调整大小 - 运行应用程序并将大量文本粘贴到文本视图中(例如:http://www.gutenberg.org/cache/epub/12281/pg12281.txt(
- 滚动到
NSTextView
顶部,观察调整窗口大小时文本的换行方式 - 滚动到底部并观察它仅在调整窗口大小后如何换行
希望有任何可可侦探可以对此提供一些启发。
编辑:根据文档,它指出"布局管理器保留为更大范围执行布局的权利"。我认为这意味着它确实是作为性能考虑因素。
但是,有没有办法确定限制是什么?
编辑:您可以尝试子类化NSScrollView以将文本呈现到多个容器中。
NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string];
NSLayoutManager *manager = [[NSLayoutManager alloc] init];
[storage addLayoutManager:manager];
NSInteger i = 0;
while (YES) {
NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(width, height)];
[manager addTextContainer:container];
NSTextView *textView = [[NSTextView alloc] initWithFrame:CGRectMake(x, y, width, height) textContainer:container];
[self.contentView addSubview:textView];
i++;
NSRange range = [manager glyphRangeForTextContainer:container];
if ( range.length + range.location == string.length )
break;
}
然后,在调整窗口大小时,可以调用 NSLayoutManager 来确保布局仅适用于可见容器。