Swift - 如何扩展UITableViewCell的高度,同时将相邻的单元格推离选定的单元格?

时间:2017-10-25 19:05:23

标签: ios swift uitableview animation cell

我正在开发一个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:删除它们取消选择细胞。这最终使得动画效果更好,并且更接近我正在拍摄的“事物”示例。然而,这使得表格过于复杂,因为通过在每次选择行时添加和移除单元格,它将改变其他单元格的索引,这使得在任何给定时间预测哪些单元格具有什么索引令人沮丧。

可能的解决方案想法?

在研究了几天之后,我能想到实现我想要的另一种方法是以某种方式稍微滚动表格,同时选择单元格的高度发生变化..这样当单元格扩展时(向下移动下面的单元格)会使之前的单元格向上移动。我很想尝试这个,因为它感觉像是一个黑客,应该有更好的方法来实现这一目标。

任何帮助都会非常感激!我一直在以惊人的速度拔头发。感谢能够分享知识的任何人。

0 个答案:

没有答案