删除动画完成后,将UITableViewCells动画到新位置

时间:2014-04-24 02:42:18

标签: ios objective-c uitableview

我有一个UITableView,允许用户通过向左滑动来删除其中的行(非常类似于应用Clear)。我的问题是被删除的UITableViewCells下面的所有UITableViewCells动画到他们的新帧,而删除的单元格的动画正在发生。我想让它在之后发生已删除单元格的动画结束。

我的代码:

//Starts updating the table
[CATransaction begin];
[CATransaction setAnimationDuration:JTTableViewRowAnimationDuration];
[CATransaction setCompletionBlock: ^{
    [self.spenderTable reloadData];
}];
[tableView beginUpdates];
if (state == JTTableViewCellEditingStateLeft)
{
    [self.list.spendrItems removeObjectAtIndex:indexPath.row];

    //!!Animation happens here!!
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}

[tableView endUpdates];
[CATransaction commit];

[tableView performSelector:@selector(reloadVisibleRowsExceptIndexPath:) withObject:indexPath afterDelay:JTTableViewRowAnimationDuration * 2];

我也在使用this great UITableView

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:0)

得知这个......对于其他任何感兴趣的人。你可以用两种方式:

方法#1(在动画块中换行):

[UIView  animateWithDuration:0.25 animations:^{
        [[(JTTransformableTableViewCell *)[self.spenderTable cellForRowAtIndexPath:indexPath] contentView] setX:-320];
    }completion:^(BOOL done){
        [self.list.spendrItems removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
    }];

请记住在完成块中操作数据源以避免内部一致性异常。

方法#2(继承自UITableView):

像这样覆盖动画:

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation{
 for (NSIndexPath *indexPath in indexPaths)
 {
     UITableViewCell *cell = [self cellForRowAtIndexPath:indexPath];
    [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)];

    [UIView beginAnimations:NULL context:nil];
    [UIView setAnimationDuration:1];
    [cell setFrame:CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)];
    [UIView commitAnimations];
}

}