2013-03-12 58 views
5

我试图使用自动布局在代码中的NSScrollView(即标准配置)内部创建NSTableView。我无法弄清楚如何使这项工作。使用自动布局的NSClipView/NSScrollView内的NSTableView的帧

这里是我的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的边界。该视图在窗口内部并被调整大小,当我这样做时,它将调整scrollview,剪辑视图和表格的大小,但是我永远不能在任何地方滚动。

看看我得到的约束,NSScrollView获取了设置剪辑视图来填充它的约束条件,剪辑视图根本没有约束,而且表视图有一堆与其中的NSTableRowViews相关的约束条件。

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

+0

如果我为'tableScroll'设置了自动调整掩码,在'tableScroll'和'fileTable'上调用'setTranslatesAutoresizingMaskIntoConstraints:YES'并移除两个'addConstraints'调用,它工作正常,我在剪辑视图中看到'NSAutoresizingMaskLayoutConstraint'指定'fileTable'需要的确切大小。 – 2013-03-13 17:30:53

回答

1

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

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

没有正确设置的明显副作用是表(例如)不能正确滚动超出视图中可见的内容。