0

我目前正在使用一个 uitableview,它主要包含 44pts 的标准尺寸单元格。但是,有一对更大,大约 160 点。

在本例中,有 2 行高度为 44pts,较大的 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,它们会消失而不是完成动画。

似乎表格以它只有 44pts 的概念为行设置动画,然后一旦达到 44pts 在上面的行下方的点,它就会从表格中删除。我忽略了哪些细节可以为表格提供正确的概念以自动为行删除设置动画?

谢谢你的帮助。

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

4

1 回答 1

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;
}

有一些簿记正在进行以跟踪被删除的索引路径。可能有更清洁的方法可以做到这一点。这只是想到的第一件事。这是一个工作示例项目

于 2013-09-04T19:15:05.630 回答