5

NSTableView自動レイアウトを使用して、コード内NSScrollView(つまり、標準構成)を作成しようとしています。これを機能させる方法がわかりません。

これが私のloadViewです:

- (void)loadView
{
    NSView *view = [[NSView alloc] init];

    NSScrollView *tableScroll = [[NSScrollView alloc] init];
    NSTableView *fileTable = [[NSTableView alloc] init];
    [tableScroll setDocumentView:fileTable];
    [tableScroll setHasVerticalScroller:YES];
    [tableScroll setHasHorizontalScroller:NO];
    fileTable.delegate = self;
    fileTable.dataSource = self;
    [fileTable setHeaderView:nil];
    [fileTable setAllowsColumnReordering:NO];

    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column1"];
    [fileTable addTableColumn:column];

    [tableScroll setTranslatesAutoresizingMaskIntoConstraints:NO];
    [fileTable setTranslatesAutoresizingMaskIntoConstraints:NO];

    [view addSubview:tableScroll];

    NSDictionary *topViews = NSDictionaryOfVariableBindings(tableScroll);
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableScroll]|" options:0 metrics:nil views:topViews]];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableScroll]|" options:0 metrics:nil views:topViews]];

    self.fileTable = fileTable;

    self.view = view;
}

何が起こるかというと、私のテーブルビューのフレームは常にの境界に等しくなりますNSClipView。ビューはウィンドウ内にあり、それに合わせてサイズが変更されます。これを行うと、スクロールビュー、クリップビュー、およびテーブルのサイズが変更されますが、どこにもスクロールできません。

私が取得した制約を見るとNSScrollView、クリップビューをそれを満たすように設定するgets制約があり、クリップビューにはまったく制約がなく、テーブルビューにはそのNSTableRowViews内部に関連する一連の制約があります。

クリップビューのような制約を追加する|[fileTable(>=500)]と、500ピクセルのNSTableViewが得られますが、明らかにそれはしたくありません。

4

1 に答える 1

1

これは上記のコメントでポスターによって回答されましたが、ここに回答を入れると思いました(同じ問題に遭遇しました)。自動レイアウトを採用している場合は、通常、xib で「マスクを制約に変換」のチェックを外します。ただし、NSScrollViewやのようなクラスの場合は、通常、プロパティを にNSTableView設定して、独自の内部ビューを管理できるようにする必要があります。これらのビューの外部にある制約を設定すること、つまりスーパービューに関連してサイズを変更することはまだ問題ありません。translatesAutoresizingMaskIntoConstraintsYES

に設定translatesAutoresizingMaskIntoConstraintsするとNO、すべての内部ビューに制約を指定する必要があります。これは、特にカスタム動作が必要でない限り (ほとんど必要ありません)、やりたくないでしょう。これは上記の特定の問題でした。

これを正しく設定しないと明らかな副作用として、(たとえば) テーブルがビューに表示されている範囲を超えて適切にスクロールされないことがあります。

于 2015-10-19T00:29:00.400 に答える