在UITableViewCells上使用动态高度时的UITableView ContentSize

时间:2016-02-03 18:50:50

标签: ios objective-c uitableview xamarin.ios

我一直在寻找这个问题好几个小时但没找到办法让它成功。

我有一个UITableView UITableViewCells使用AutomaticDimension代表身高:

tableView.RowHeight = UITableView.AutomaticDimension;
tableView.EstimatedRowHeight = 160f;

问题是当我尝试获取tableView的ContentSize时。它似乎是基于EstimatedRowHeight而不是其行的当前高度来计算的。假设,如果有10个单元格,则ContentSize的返回值为160x10。

然后我的问题是,是否有办法做到这一点。

任何帮助都会非常感激...我使用的是Xamarin.iOS,但显然欢迎Obj-C和Swift答案:)

3 个答案:

答案 0 :(得分:11)

我认为@Daniel J的回答只能起作用,因为动画完成处理程序的安排方式 - 从表面来看,无法保证在动画完成之前表重新加载。

我认为更好的解决方案是(在Swift中,因为我正在使用它): -

func reloadAndResizeTable() {

    self.tableView.reloadData()
    dispatch_async(dispatch_get_main_queue()) {
        self.tableHeightConstraint.constant = self.tableView.contentSize.height
        UIView.animateWithDuration(0.4) {
            self.view.layoutIfNeeded()
        }
    }
}

由于我想要的效果,我实际上使用了动画延迟,但它也可以使用持续时间为零。每次更新表格内容时都会调用此函数,并根据需要设置动画并调整大小。

答案 1 :(得分:7)

我有一个场景,我需要知道contentSize,在非全屏tableView上设置框架,其具有不同高度的不同细胞计数。然后我将tableView(通过NSLayoutConstraint)调整为该内容的高度。

以下工作,但我觉得它有点hacky:

在' viewDidLoad'中设置所有代码
将rowHeight设置为自动
将estimatedRowHeight设置为大于我预期的单元格(在这种情况下,我没有预期单元格会高于大约60磅,因此将估计值设置为120) 将tableView重新加载到动画块中,然后查询contentSize并在完成块中执行适当的操作

- (void)viewDidLoad {
    [super viewDidLoad]; 

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 120.0;

    [UIView animateWithDuration:0 animations:^{
        [self.tableView reloadData];
    } completion:^(BOOL finished) {
        self.tableViewHeight.constant = self.tableView.contentSize.height;
        [self.view layoutIfNeeded];
    }];
}

答案 2 :(得分:0)

self.coins = coins
tableView.reloadData()
view.layoutIfNeeded()
tableViewHeightConstraint.constant = tableView.contentSize.height
view.layoutIfNeeded()

没有UITableViewAutomaticDimension和estimatedRowHeight。 iOS 11