iOS:如何动态设置UITableView的高度

3
我有一个包含表格视图的视图控制器(见下面的截图)。这个表格视图始终恰好有3行,并且这些行在单击时会展开以显示更多信息。如何使表格视图的高度总是恰好显示这三行,不多不少?正如您在屏幕截图中看到的那样,没有内容的空行正在显示。
请注意,展开的行可能包含除UILabel之外的其他视图。
以下是它在IB中的外观:

如何实现这一点在一定程度上取决于您的设计。您是如何扩展单元格的?您允许同时扩展多个单元格吗? - rdelmar
6个回答

5
我认为您需要类似这样的东西。
//Return number of rows in section
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    [self setTableHeight];
    return 3;
}

//Method which lets you calculate the height of tableView depending on your 3 cells
- (void)setTableHeight
{

    if(_isRowExpanded == NO)
    {
        tableHeightCalculated = rowHeight * 3; // rowHeight use default 44 or ur custom
    }
    else
    {
        //You need to put some logic here to Calculate or put approx height of  Expanded_Row_Height
        tableHeightCalculated = rowHeight * 2 + Expanded_Row_Height;

        if(tableHeightCalculated > maxHeightAllowed) //maxHeightAllowed is your current table height in snapshot
        {
            tableHeightCalculated = maxHeightAllowed;
        }
    }
    tableView.frame = CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y,
                                 tableView.frame.size.width,  tableHeightCalculated);
}

0

添加这个footerview方法,它会起作用。这将删除空单元格。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].applicationFrame.size.width, 0)];
v.backgroundColor = [UIColor clearColor];
[tableView setTableHeaderView:v];
[tableView setTableFooterView:v];
return v;
}

是的,这样可以删除空单元格,但不会改变表格的高度。它会在我的行下面留下一堆空白空间。 - James Harpe

0

如果UITableView的垂直空间大于实际单元格所需的空间,它会插入虚假的空单元格。你不能真正控制这种行为,你能做的最多就是将表视图的高度设置为足够小的值。


那么我该如何计算适当的高度呢? - James Harpe
但是一个单元格的高度是动态的,而不是一些固定值。 - James Harpe
@JamesHarpe听说过变量吗?你可以重新加载表视图,然后它会再次询问其代理以获取表格单元高度数据。 - user529758
如果那个单元格还没有被加载,我怎么确定要返回一个行的高度呢?如果我能解决这个问题,就可以用它来设置整个表格的高度。 - James Harpe

0
使用任何想要通过编程操作的控件的frame属性。 frame还有sizeorigin两个属性。使用size属性可以操纵宽度和高度,使用origin可以操纵控件的xy属性。
你想要的可以通过以下方式完成: CGRect frame = control.frame; //control是您的UIControl frame.size.height = 10.0; //假设10是所需高度。 control.frame = frame; 希望这是您要寻找的内容。

我该如何将这个高度值动态设置为我的三行的高度?我该如何计算这个高度? - James Harpe
这并不能帮助我设置表格的高度。基于我的三行的高度,我该如何计算表格视图应该具有的高度? - James Harpe
是的,我可以设置一个初始高度为132,但当行被点击时,单元格将展开以显示更多视图。我不知道这些视图的高度。因此,我需要一种方法来获取单元格展开后的新高度,并相应地更新表格高度。 - James Harpe
好的,你可以使用简单的方法来实现。你应该为被点击的行添加一个标记属性,每当你点击一个单元格,使用[tableview reloadRowsAtIndexPath:[NSArray arrayWithObject:indexPath]]重新加载这个单元格。它会重新加载这一行,所以在你的数据源和代理中的每个方法中,你都需要平衡这个检查:返回更大的高度,渲染一个新的视图等等。希望这是你想要的。 - Farrukh Javeid
当调用heightForRowAtIndexPath时,单元格尚未创建。那么,我如何知道如何设置行的高度?如果我能弄清楚这一点,那么我就可以使用它来更新整个表的高度。 - James Harpe
显示剩余4条评论

0

试着初始化表格的底部视图:

TableView.tableFooterView = [[UIView alloc] init];


这将删除空单元格,但不会改变表格的高度。实际上,它看起来像是在上面的截图中删除了额外的行。 - James Harpe

0

这两行代码对我来说非常有效,因为它们可以让表格的大小与内容大小完全匹配。虽然这只是一种“幻觉”,但却非常实用。

 self.tableView.tableFooterView = [UIView new];
 self.view.backgroundColor = [UIColor whiteColor];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接