我有一堆NSTextView
我希望分享一个选择。我基本上希望这个行为类似于在网页上选择文本,其中有多个文本视图,但您可以拖动以顺序选择其中的文本。
我找到了this文档,其中指出可以让多个NSTextContainer
个对象共享一个NSLayoutManager
,从而共享选择。这是我想要的一半,除了一个NSLayoutManager
只能有一个NSTextStorage
对象的事实。我希望每个文本视图都有自己的NSTextStorage
,这样每个文本视图都可以有自己的文本,但我仍然希望能够通过一次拖动选择多个文本视图中的文本。这可能吗?
答案 0 :(得分:4)
没有简单的方法来解决这个问题(因为我试图通过提出这个问题来找到)。它涉及您期望的所有鼠标事件处理和文本选择计算,因此我编写了代码并将其开源为INDSequentialTextSelectionManager
。
答案 1 :(得分:0)
要使这个单独的文本容器起作用,您可以计算字符串每个部分的绘制大小,并将NSTextView限制为该大小:
NSLayoutManager * layout = [[NSLayoutManager alloc] init];
NSString * storedString = @"A\nquick\nBrown\nFox";
NSTextStorage * storage = [[NSTextStorage alloc] initWithString:storedString];
[storage addLayoutManager:layout];
//I assume you have a parent view to add the text views
NSView * view;
//Assuming you want to split up into separate view by line break
NSArray * paragraphs = [storedString componentsSeparatedByString:@"\n"];
for (NSString * paragraph in paragraphs)
{
NSSize paragraphSize = [paragraph sizeWithAttributes:@{}];
//Create a text container only big enough for the string to be displayed by the text view
NSTextContainer * paragraphContainer = [[NSTextContainer alloc] initWithContainerSize:paragraphSize];
[layout addTextContainer:paragraphContainer];
//Use autolayout or calculate size/placement as you go along
NSRect lazyRectWithoutSizeOrPlacement = NSMakeRect(0, 0, 0, 0);
NSTextView * textView = [[NSTextView alloc] initWithFrame:lazyRectWithoutSizeOrPlacement
textContainer:paragraphContainer];
[view addSubview:textView];
}
您可以向NSLayoutManager添加委托以观察文本容器的使用情况:
- (void)layoutManager:(NSLayoutManager *)aLayoutManager
didCompleteLayoutForTextContainer:(NSTextContainer *)aTextContainer
atEnd:(BOOL)flag
{
if (aTextContainer == nil)
{
//All text was unable to be displayed in existing containers. A new NSTextContainer is needed.
}
}