使用自动布局增加和缩小表视图

时间:2014-07-07 10:08:52

标签: objective-c cocoa autolayout nstableview

我正在尝试构建一个视图,其中包含垂直堆叠的多个表视图。我希望表格与其内容一起增长,而不是为每个表格视图指定一个固定的高度。然后堆栈嵌套在滚动视图中。

使用自动布局,我设法让嵌套的滚动视图随其表视图一起增长。但是,当我从表视图中删除行时,我无法将这些缩小。自动布局似乎假设视图的最佳大小是其当前大小。在我的设置中,最佳尺寸将是最小的尺寸。

“界面”构建器中的设置:

- Scrollview
-- Clipview
--- Container
---- Nested Scrollview
------ Clipview
------- Tableview
---- Nested Scrollview
------ Clipview
------- Tableview

在代码中,我添加约束来将表视图的前导,尾随,顶部和底部固定到它们的直接父剪辑视图。

测试项目(https://dl.dropboxusercontent.com/u/2381634/SO/AdjacentTableViews%20Auto-Layout.zip)包含用于添加和删除两个表视图中的行的按钮。

添加行会增加表格视图,剪辑视图,....外部双桨视图可以按预期滚动。

删除行无法缩小嵌套滚动视图。

如何让自动布局考虑最小拟合尺寸,拥抱内容,......?

1 个答案:

答案 0 :(得分:0)

我最终继承了NSScrollView和NSTableView,以根据表视图中的行数计算intrinsicContentSize:

@implementation HHNestedScrollView

- (NSSize)intrinsicContentSize
{
    NSView  *documentView   = [self documentView];
    NSSize  fSize           = [documentView intrinsicContentSize];

    if (fSize.height >= 0) {
        if (self.borderType != NSNoBorder) {
            fSize.height += 2;
        }
    }

    return fSize;
}

- (void)scrollWheel:(NSEvent *)theEvent
{
    [[self nextResponder] scrollWheel:theEvent];

    [self setNeedsLayout:YES];
}

@end


@implementation HHNestedTableView 

- (NSSize)intrinsicContentSize
{
    NSSize      fSize   = [super intrinsicContentSize];

    NSInteger   nr      = [self numberOfRows];
    CGFloat     rh      = [self rowHeight];
    CGFloat     ih      = [self intercellSpacing].height;

    fSize.height = rh * nr + ih * MAX(nr, 1);

    return fSize;
}

@end

只要表视图中的行数发生变化,我的视图控制器就会使intrinsicContentSize无效:

[[self.tableView enclosingScrollView] invalidateIntrinsicContentSize];