我正在开发一个ViewController,其中一个TableView填充了原型nib中的动态单元格。我试图重新创建一个细胞扩展动画,我遇到了一个死胡同。
我的目标:
当选择一个单元格时,所选单元格应“展开”(高度增加到其起始大小的两倍),同时在所选单元格正上方和下方的单元格之间创建空间。
我在应用“Things”中找到了一个我正在寻找的动画的例子。下面是两个屏幕截图,显示了选择单元格之前和之后的表格:
Screenshot of table BEFORE expansion
Screenshot of table AFTER expansion
我能描述所需动画的最佳方式是 UITableView版本的“红海分离”。当选择一个单元格时,周围的单元格会让所选单元格更具空间......以及用户的焦点。
我尝试了什么:
我发现Simon Lee's method回答了类似的问题并将其实施到我的项目中。虽然它完美地激活了行高变化,但它只会推动所选单元格一侧的相邻单元格。 (即:如果选择了索引4处的单元格,则索引5+中的所有单元格都会向下移动,但索引0-3中的单元格将保持静态。从而无法实现我正在寻找的外观。)
使用该方法,我的代码的相关部分看起来像:
var cellHeight: CGFloat = 72
var selectedCell: IndexPath?
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath == selectedCell {
return cellHeight * 2
} else {
return cellHeight
}
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedCell = indexPath
tableView.beginUpdates()
tableView.endUpdates()
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
selectedCell = nil
tableView.beginUpdates()
tableView.endUpdates()
}
因为这不会产生我想要的动画,所以我尝试insertRows:at:with:
插入2个空单元格(上面的1个和所选行下面的1个) - 然后deleteRows:at:with:
删除它们取消选择细胞。这最终使得动画效果更好,并且更接近我正在拍摄的“事物”示例。然而,这使得表格过于复杂,因为通过在每次选择行时添加和移除单元格,它将改变其他单元格的索引,这使得在任何给定时间预测哪些单元格具有什么索引令人沮丧。
可能的解决方案想法?
在研究了几天之后,我能想到实现我想要的另一种方法是以某种方式稍微滚动表格,同时选择单元格的高度发生变化..这样当单元格扩展时(向下移动下面的单元格)会使之前的单元格向上移动。我很想尝试这个,因为它感觉像是一个黑客,应该有更好的方法来实现这一目标。
任何帮助都会非常感激!我一直在以惊人的速度拔头发。感谢能够分享知识的任何人。