我一直在寻找这个问题好几个小时但没找到办法让它成功。
我有一个UITableView
UITableViewCells
使用AutomaticDimension
代表身高:
tableView.RowHeight = UITableView.AutomaticDimension;
tableView.EstimatedRowHeight = 160f;
问题是当我尝试获取tableView的ContentSize
时。它似乎是基于EstimatedRowHeight
而不是其行的当前高度来计算的。假设,如果有10个单元格,则ContentSize的返回值为160x10。
然后我的问题是,是否有办法做到这一点。
任何帮助都会非常感激...我使用的是Xamarin.iOS,但显然欢迎Obj-C和Swift答案:)
答案 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