为什么 NSTextView 在调整大小时并不总是流畅地换行文本?



我在NSTextView中偶然发现了一种行为,这似乎不是故意的,或者至少我不明白背后的原因。

当您在NSTextView中有大量文本并调整控件/窗口的大小时,单词的换行仅在文本在顶部附近滚动时在调整大小流畅且立即发生。如果您在文本中向下滚动,它不会,并且在您发布并完成调整大小之前,它似乎不会"提交"换行。

是否存在一些内部限制,或者这是一个错误?

该问题似乎是可重现的:

macOS 10.15.4, Xcode 11.4.1

  1. 创建新的 macOS 应用程序项目
  2. 在默认生成的视图控制器上放置一个NSTextView(无论 3 个中的哪一个:富、纯或默认(并约束它,使其随窗口(顶部、底部、前导、尾随(调整大小
  3. 运行应用程序并将大量文本粘贴到文本视图中(例如:http://www.gutenberg.org/cache/epub/12281/pg12281.txt(
  4. 滚动到NSTextView顶部,观察调整窗口大小文本的换行方式
  5. 滚动到底部并观察它仅在调整窗口大小如何换行

希望有任何可可侦探可以对此提供一些启发。

编辑:根据文档,它指出"布局管理器保留为更大范围执行布局的权利"。我认为这意味着它确实是作为性能考虑因素。

但是,有没有办法确定限制是什么?

编辑:您可以尝试子类化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 来确保布局仅适用于可见容器。

最新更新