使用自动布局在NSClipView / NSScrollView中的NSTableView框架

时间:2013-03-12 17:44:23

标签: macos cocoa nstableview autolayout nsscrollview

我正在尝试使用自动布局在代码中的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获取设置剪辑视图以填充它的约束,剪辑视图根本没有约束,并且表视图有一堆与{{1}相关的约束在里面。

如果我在剪辑视图中添加NSTableRowViews等约束,我将获得500像素的NSTableView,但显然我不想这样做。

1 个答案:

答案 0 :(得分:1)

尽管上面的评论中的海报回答了这个问题,但我认为我已经把答案放在了这里(遇到了同样的问题)。如果您采用自动布局,通常会取消选中xib中的“将蒙版转换为约束”。但是,对于NSScrollViewNSTableView等类,您通常应该让他们通过将translatesAutoresizingMaskIntoConstraints属性设置为YES来管理自己的内部视图。仍然可以将外部的约束设置为这些视图,即相对于其超级视图调整大小。

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

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