uitableview单元格删除,自定义动画

时间:2014-09-03 16:46:41

标签: ios objective-c uitableview uiviewanimation

我正在尝试通过覆盖deleteRowsAtIndexPaths方法来创建用于删除表行的自定义动画。我成功创建了自定义插入动画,并试图反转删除部分的动画,但我得到一些错误:断言失败 - [UITableView _endCellAnimationsWithContext:]

NSInternalInconsistencyException',原因:'无效更新:第0节中的行数无效。(更新后的行必须等于更新前的行)。

如果我不重写deleteRows方法并使用tableView的默认删除方法,一切正常,但不是我自己的方法。



这是在tableViewController类中编写的overriden方法:

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths
              withRowAnimation:(UITableViewRowAnimation)animation
{

    [[super tableView] insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates]; // Populates UITableView with data
    [self.tableView beginUpdates];
    for (NSIndexPath *indexPath in indexPaths) {
        __block UITableViewCell *cell = [[super tableView] cellForRowAtIndexPath:indexPath];
        if (cell) { // If indexPath isn't visible we'll get nil here
            // Custom animation
            CGRect frame = cell.frame;
            frame.origin.x = cell.frame.size.width;
            cell.frame = frame;
            frame.origin.x = 0;
            void (^animationsBlock)() = ^{
                cell.frame = frame;
            };
            if ([[UIView class] respondsToSelector:
                 @selector(animateWithDuration:delay:usingSpringWithDamping:
                           initialSpringVelocity:options:animations:completion:)]) {
                     [UIView animateWithDuration:0.9
                                           delay:0
                          usingSpringWithDamping:0.5
                           initialSpringVelocity:0
                                         options:0
                                      animations:animationsBlock
                                      completion:NULL];
                 } else {
                     [UIView animateWithDuration:0.3
                                           delay:0
                                         options:UIViewAnimationOptionCurveEaseIn
                                      animations:animationsBlock
                                      completion:NULL];
                 }
        }
    }
}

deleteRowsAtIndexPathsMethod:

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths
              withRowAnimation:(UITableViewRowAnimation)animation
{

    [[super tableView] deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates]; // Populates UITableView with data
    [self.tableView beginUpdates];
    for (NSIndexPath *indexPath in indexPaths) {
        __block UITableViewCell *cell = [[super tableView] cellForRowAtIndexPath:indexPath];
        if (cell) { // If indexPath isn't visible we'll get nil here
            // Custom animation
            CGRect frame = cell.frame;
            frame.origin.x = 0;
            cell.frame = frame;
            frame.origin.x = cell.frame.size.width;
            void (^animationsBlock)() = ^{
                cell.frame = frame;
            };
            if ([[UIView class] respondsToSelector:
                 @selector(animateWithDuration:delay:options:animations:completion:)]) {
                     [UIView animateWithDuration:0.9
                                           delay:0
                                         options:UIViewAnimationOptionCurveEaseIn
                                      animations:animationsBlock
                                      completion:NULL];
                 } else {
                     [UIView animateWithDuration:0.9
                                           delay:0
                                         options:UIViewAnimationCurveLinear
                                      animations:animationsBlock
                                      completion:NULL];
                 }
        }
    }
}

编辑:此代码位于方法内部,每当我修改单元格的对象时,该方法都会运行。我修改一个对象并将其保存到核心数据,然后我使用[self populateData]检索所有更新的对象,然后我想运行动画:删除旧单元格并在tableView底部的某处插入新更新的单元格< BR />

[coreDataStack saveContext];
[self populateData];

[self.tableView beginUpdates];

int oldIndex = indexPath.row;
int newIndex = newIndexPath.row;
if(oldIndex<newIndex){
    [self deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
    [self insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationTop];

} else if (oldIndex>newIndex) {
    [self deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];

    [self insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationBottom];

} else {
    [self.tableView reloadRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationMiddle];
}

[self.tableView endUpdates];

0 个答案:

没有答案