自定义UITableViewCell高度会产生不正确的动画

时间:2013-09-04 13:35:47

标签: ios objective-c animation uitableview

我目前正在使用uitableview,其中大部分标准尺寸单元格为44磅。然而,有一些更大,约160pts。

在这种情况下,有44行高度的2行,下面插入较大的160pts行,在该部分的索引2处。

撤职电话:

- (void)removeRowInSection:(TableViewSection *)section atIndex:(NSUInteger)index {
    NSUInteger sectionIndex = [self.sections indexOfObject:section];

    NSIndexPath *removalPath = [NSIndexPath indexPathForRow:index inSection:sectionIndex];

    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:@[removalPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
}

代表电话:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewSection *section = [self sectionAtIndex:indexPath.section];

    return [section heightForRowAtIndex:indexPath.row];
}

节电话:

- (NSInteger)heightForRowAtIndex:(NSInteger)index {
    StandardCell *cell = (StandardCell *)[self.list objectAtIndex:index];

    return cell.height;
}

细胞电话:

- (CGFloat)height {
    return 160;
}

让我感到困惑的是,当我从表格中移除较大的行时,它们开始动画,在上面的行下方移动。但当他们到达某一点时,大约是动画的1/4,他们就会消失,而不是完成动画。

看起来桌子上的动画只有44分,然后一旦它到达44ts位于上面一行的位置,就会从表中移除。我忽略了哪些细节会给表格提供自动动画删除行的正确概念?

感谢您的帮助。

更新 我试着注释掉上面的高度函数(它会覆盖返回44的默认值)。这会产生一个没有跳过的正确动画。 FWIW

1 个答案:

答案 0 :(得分:4)

解决此问题的一种方法是在删除之前将行高设置为44:

//mark index paths being deleted and trigger `contentSize` update
self.indexPathsBeingDeleted = [NSMutableArray arrayWithArray:@[indexPath]];
[tableView beginUpdates];
[tableView endUpdates];

//delete row
[self.tableView deleteRowsAtIndexPaths:@[removalPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];

然后在heightForRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.indexPathsBeingDeleted containsObject:indexPath]) {
        //return normal height if cell is being deleted
        [self.indexPathsBeingDeleted removeObject:indexPath];
        return 44;
    }
    if (<test for tall row>) {
        return 160;
    }
    return 44;
}

正在进行一些记账以跟踪被删除的索引路径。可能有更简洁的方法来做到这一点。这是我想到的第一件事。这是working sample project