行删除动画完成后的UITableView回调

时间:2011-05-18 01:52:46

标签: uitableview animation delete-row

我有一张桌子,顶部和底部单元格下方有阴影(使用Matt Gallagher的解决方案:http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html)。这些是在UITableView类扩展的layoutSubviews方法中添加的。

我动态地添加和删除每个主单元格下面的单元格(这些提供了额外的数据) - 让我们称这些“细节”单元格。一次只有一个开放。当删除最后一个主单元格下方的“细节单元格”时,随着动画开始,阴影向上轻拂到最后一个单元格(在细节单元格上方)。这样做是因为layoutSubview方法认为表的最后一个单元在deleteRowsAtIndexPaths的动画开始时(而不是在动画结束时)改变了。

所以,从本质上讲,我需要一种方法来将阴影保留在细节单元格下面,因为它被删除了。不确定最好的方法。如果UITableView不再认为该单元格是最后一个单元格,那么我甚至不确定如何获取单元格(因为UITableView因此得到了单元格):

NSIndexPath *lastRow = [indexPathsForVisibleRows lastObject];
if ([lastRow section] == [self numberOfSections] - 1 &&
    [lastRow row] == [self numberOfRowsInSection:[lastRow section]] - 1)
 {
        //adds shadow below it here
     }

因此,如果UITableView仍然认为“detail”单元格上方的主单元格是“lastObject”,那么即使捕获动画的开头也没什么用。

感谢任何想法。

3 个答案:

答案 0 :(得分:4)

试试这个

[CATransaction begin];

[tableView beginUpdates];

//...

[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
}];

[tableView deleteRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];


[tableView endUpdates];

[CATransaction commit];

答案 1 :(得分:0)

我确信你可以通过使用自定义表视图类而不是使用外部框架工作的依赖项来轻松实现这一点,只需从uitable视图继承并向其添加子视图。

但是如果你坚持这样做的话。在删除之前在自己的变量中引用。

答案 2 :(得分:0)

Swift(这个想法是一样的,你当然可以在obj-c中使用它):

UIView.animateWithDuration(0.3, animations: { () -> Void in
    self.tableView.scrollToRowAtIndexPath(indexPathes, withRowAnimation: UITableViewRowAnimation.None)
}, completion: { (Bool) -> Void in
    // The logic you want to execute after the animation
})