我正在尝试使用自动布局在代码中的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,但显然我不想这样做。
答案 0 :(得分:1)
尽管上面的评论中的海报回答了这个问题,但我认为我已经把答案放在了这里(遇到了同样的问题)。如果您采用自动布局,通常会取消选中xib中的“将蒙版转换为约束”。但是,对于NSScrollView
和NSTableView
等类,您通常应该让他们通过将translatesAutoresizingMaskIntoConstraints
属性设置为YES
来管理自己的内部视图。仍然可以将外部的约束设置为这些视图,即相对于其超级视图调整大小。
如果将translatesAutoresizingMaskIntoConstraints
设置为NO
,则需要为所有内部视图提供约束,除非您特别需要自定义行为(几乎从不),否则您不希望这样做。这是上面的具体问题。
不正确设置这一明显的副作用是表格(例如)无法正确滚动超出视图中可见的范围。