【问题标题】:Growing and shrinking table views with auto-layout使用自动布局扩大和缩小表格视图
【发布时间】:2014-07-07 10:08:52
【问题描述】:

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

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

界面生成器中的设置:

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

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

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

添加行会增加表格视图、剪辑视图……。外部 scull 视图可以按预期滚动。

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

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

【问题讨论】:

    标签: objective-c cocoa autolayout nstableview


    【解决方案1】:

    我最终将 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];
    

    【讨论】:

    • 如果我理解正确,您希望内部滚动视图永远不会滚动。它们的大小应始终适合封闭表视图的全部内容。对?在这种情况下,我会将它们从层次结构中删除。在 IB 中,您不能在没有滚动视图的情况下将新的表格视图拖动到文档中,但是您可以拖动以将表格视图复制到没有封闭滚动视图的另一个视图中。
    • 确实:我希望内部滚动视图永远不会滚动。我尝试了许多不同的解决方案。以上是我确定的。不幸的是,我不记得所有可能的解决方案,也不记得为什么我将它们排除在外。
    • 我确实记得一些事情——可能是 IB——假设表格视图与滚动视图相关联。我已通过编辑 XIB XML 成功删除了嵌套滚动视图。该文件是有效的,并且在一定程度上发挥了作用,但还不够好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多