gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:08:46 26 4
gpt4 key购买 nike

我在 NSTextView 中偶然发现了一种似乎并非有意为之的行为,或者至少我不明白其背后的原因。

当您在 NSTextView 中有大量文本并且调整控件/窗口的大小时,文字换行只会在文本调整大小时流畅且立即发生滚动到顶部附近。如果您在文本中向下滚动很远,它不会,并且在您释放并完成调整大小之前,它似乎不会“提交”换行。

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

这个问题似乎可以重现:

macOS 10.15.4、Xcode 11.4.1

  1. 创建新的 macOS 应用项目
  2. NSTextView 放在默认生成的 View Controller 上(无论是 3 个中的哪一个:丰富、普通还是默认)并约束它,以便它随窗口(顶部、底部、前导、尾随)
  3. 运行应用程序并将大量文本粘贴到 TextView 中(例如: http://www.gutenberg.org/cache/epub/12281/pg12281.txt )
  4. 滚动到 NSTextView 顶部,并观察在调整窗口大小时文本如何换行
  5. 滚动到底部并观察调整窗口大小后它是如何换行的

希望有任何 cocoa 侦探能够对此提供一些启发。

编辑:根据docs ,它指出“布局管理器保留对更大范围进行布局的权利”。我认为这意味着它确实是出于性能考虑。

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

最佳答案

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

关于macos - 为什么 NSTextView 在调整大小时并不总是流畅地换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61897767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com