7

NSTextView私は1つの選択を共有したいたくさんのを持っています。基本的に、これをWebページ上のテキストを選択するように動作させたいと思います。この場合、複数のテキストビューがありますが、ドラッグしてそれらの中からテキストを順番に選択できます。

複数のオブジェクトで1つのオブジェクトを共有し、選択範囲を共有することが可能であると述べているこのドキュメントを見つけました。これは、1つのオブジェクトしか持てないという事実を除いて、私が望むものの半分です。各テキストビューが独自のテキストを持つことができるように、各テキストビューに独自のテキストを持たせたいのですが、それでも1回のドラッグで複数のテキストビューのテキストを選択できるようにしたいのです。これは可能ですか?NSTextContainerNSLayoutManagerNSLayoutManagerNSTextStorageNSTextStorage

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 に答える