7

我有一堆NSTextViews 我想分享一个选择。我基本上希望它的行为类似于在网页上选择文本,其中有多个文本视图,但您可以拖动以在其中顺序选择文本。

我发现这个文档指出可以让多个NSTextContainer对象共享一个对象NSLayoutManager,从而共享选择。NSLayoutManager这是我想要的一半,除了一个只能有一个NSTextStorage对象的事实。我希望每个文本视图都有自己的NSTextStorage,以便每个文本视图都可以有自己的文本,但我仍然希望能够通过一次拖动在多个文本视图中选择文本。这可能吗?

4

2 回答 2

4

没有简单的方法可以解决这个问题(正如我试图通过提出这个问题来找到的那样)。它涉及您期望的所有鼠标事件处理和文本选择计算,因此我编写了代码并将其开源为INDSequentialTextSelectionManager.

于 2014-04-19T06:39:38.773 回答
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.
    }
}
于 2013-03-19T18:45:57.933 回答