5

我正在尝试使用自动布局在代码中创建一个NSTableView内部NSScrollView(即标准配置)。我不知道如何使这项工作。

这是我的加载视图:

- (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约束,设置剪辑视图以填充它的获取约束,剪辑视图根本没有约束,而表视图有一堆与其NSTableRowViews内部相关的约束。

如果我|[fileTable(>=500)]向剪辑视图添加一个约束,我将获得 500 像素的 NSTableView,但显然我不想这样做。

4

1 回答 1

1

尽管上面评论中的发帖人回答了这个问题,但我想我会把答案放在这里(遇到同样的问题)。如果您采用自动布局,您通常会在 xib 中取消选中“将掩码转换为约束”。但是,对于 和 之类的类NSScrollView,您通常应该通过将它们的属性设置为 来NSTableView让它们管理自己的内部视图。仍然可以设置这些视图外部的约束,即相对于它们的父视图调整大小。translatesAutoresizingMaskIntoConstraintsYES

如果您设置translatesAutoresizingMaskIntoConstraintsNO,那么您将需要为所有内部视图提供约束,除非您特别需要自定义行为(几乎从不),否则您不会想要这样做。这是上面的具体问题。

未正确设置的一个明显副作用是表格(例如)将无法正确滚动超出视图中的可见范围。

于 2015-10-19T00:29:00.400 回答