使用`estimatedRowHeight`和`UITableViewAutomaticDimension`时,`moveRowAtIndexPath:toIndexPath:`中的UITableViewCell动画错误

时间:2014-12-05 15:51:12

标签: ios objective-c uitableview animation

使用moveRowAtIndexPath:toIndexPath:移动UITableViewCell时,我在使用estimatedRowHeightUITableViewAutomaticDimension时看到动画故障,当细胞从可见状态动画到一个不可见的状态。

如果我通过实施tableView:heightForRowAtIndexPath:明确设置单元格的高度,问题就会消失。仅当源索引路径和目标索引路径分别可见且不可见时,才会出现此问题。当单元格移动到另一个可见索引路径时,动画将按预期运行。

我已经创建了一个示例项目来说明效果:https://github.com/timarnold/Table-Cell-Sizing-Bug

http://www.openradar.me/19156703

修改

@rdelmar指出我的问题并没有真正提出问题。

有没有人知道解决此错误并解决此问题的方法?或者我做错了什么?

编辑2014-12-08

我使用Apple提供的一张开发人员支持服务单来向Apple询问此问题。他们确认这是一个错误(访问http://www.openradar.me/19156703来欺骗)并且没有提供任何解决方法。

2 个答案:

答案 0 :(得分:1)

尝试缓存单元格高度。

private var cellHeights = [NSIndexPath: CGFloat]()

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if let cachedHeight = cellHeights[indexPath] {
        return cachedHeight
    } else {
        return 60
    }
}

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cellHeights[indexPath] = cell.frame.height
}

答案 1 :(得分:-2)

这不是一个明确的答案,而是一些有趣的发现。我相信您遇到的行为与iOS在设备屏幕上绘制单元格的方式有关,而不是错误。更具体地说,对于离开屏幕的细胞。因为,数据源不受重新排序iOS的单元格影响,无法跟踪单元格位置。

为了使我更清楚,我对TableViewController.m进行了以下修改:

didSelectRowAtIndexPath

[tableView moveRowAtIndexPath:indexPath
                          toIndexPath:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:indexPath.section]];

cellForRowAtIndexPath

cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row + 1];


只有当移动到屏幕视图之外的位置时,您才会看到单元格行为异常。此外,每次移动屏幕时都会重新绘制单元格。