当上边距不完全可见时,UITableView 单元格展开动画会发生变化
Posted
技术标签:
【中文标题】当上边距不完全可见时,UITableView 单元格展开动画会发生变化【英文标题】:UITableView cell expand animation changes when top margin is not fully visible 【发布时间】:2017-07-12 14:38:57 【问题描述】:我尝试通过类似动画的下拉菜单使单元格展开/折叠,因此当表格视图重新计算高度时,它会向下移动其他单元格低于被点击的单元格,
但如果点击的单元格上边距不完全可见,表格视图会通过将所有上方单元格向上移动来改变其高度更新行为:
http://imgur.com/CldzuFf
有没有办法让单元格始终以自上而下的行为展开? 像这样重新加载单元格:
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:arrayToReload withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
【问题讨论】:
您的“显示更多/更少”功能使用什么方法?你在使用 UITableViewAutomaticDimension 的自动布局吗?或者您是否返回heightForRowAtIndexPath
中的特定值?还是您在插入/删除行?
是的,UITableViewAutomaticDimension 具有开始/结束更新和行重新加载,如上所示。我还在estimatedHeightForRow 中返回预先计算的单元格高度。插入/删除行而不是重新加载似乎没有区别
OK - 取决于您更改显示/隐藏单元格内容约束的具体方式,无需调用reloadRowsAtIndexPaths
...您可能会获得更好的结果...在单元格内部或cellForRowAtIndexPath
?中操作这些值
所以我应该在更新括号内配置单元格高度约束而不是重新加载,这将需要精确的高度计算,然后我才返回来自 willDisplayCell 的高度值(实际上是上一次的高度显示单元格)。我会试试的。
您应该能够使用约束而不是计算/分配特定值。有多种方法,有些实现可能以不同的方式更好地工作,但您可以在这里看到几种不同的方法:github.com/DonMag/DynamicCellHeight
【参考方案1】:
只需根据所选行设置 contentOffset
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell * theCell = (UITableViewCell *)[tableView
cellForRowAtIndexPath:indexPath];
CGPoint tableViewCenter = [tableView contentOffset];
tableViewCenter.y += myTable.frame.size.height/2;
[tableView setContentOffset:CGPointMake(0,theCell.center.y-65) animated:YES]; // need to customize the y offset 65 to your value
// reload row here
【讨论】:
我没有完全理解您的代码,但我尝试过处理动画表格视图偏移和 scrollToRowAtIndexPath 但它最终与其他动画(例如行重新加载或约束更新)发生冲突以上是关于当上边距不完全可见时,UITableView 单元格展开动画会发生变化的主要内容,如果未能解决你的问题,请参考以下文章
当单元格不可见时,UITableView indexPathForCell 返回 null
当 UITableView 单元格中的进度条不可见时,如何更新它们
将单元格添加到可见的空 UITableView 以白色背景显示