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

7 objective-c uitableview xamarin.ios ios

我一直在寻找这个很多个小时,但没有办法做到这一点.

我有一个高度UITableViewUITableViewCells用途AutomaticDimension:

tableView.RowHeight = UITableView.AutomaticDimension;
tableView.EstimatedRowHeight = 160f;
Run Code Online (Sandbox Code Playgroud)

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

那我的问题是,是否有办法做到这一点.

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

Ech*_*lon 13

我认为@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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*l J 7

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

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

设置'viewDidLoad'中的所有代码
将rowHeight设置为自动
将estimatedRowHeight设置为大于我预期的一个单元格(在这种情况下,我没想到一个单元格会高于大约60pts,所以设置估计为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];
    }];
}
Run Code Online (Sandbox Code Playgroud)