1

我想一个一个地删除带有动画的表格视图中的一些单元格,起初我使用这样的代码:

[self beginUpdates];
[self deleteRowsAtIndexPaths:removeIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self endUpdates];

removeIndexPaths 数组中有六个 indexPath。它以正确的方式工作,但动画效果是1。六个单元格为空,2。淡化空白区域。

然后我尝试使用 for/while 删除它们,如下所示:

int removeIndexRow = indexPath.row + 1;
while (item.level < nextItemInDisplay.level)
{
    NSIndexPath *removeIndexPath = [NSIndexPath indexPathForRow:removeIndexRow inSection:0];
    [items removeObject:nextItemInDisplay];
    [self beginUpdates];
    [self deleteRowsAtIndexPaths:@[removeIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    NSLog(@"1");
    sleep(1);
    NSLog(@"2");
    [self endUpdates];
}

为了了解函数的工作原理,我使用 sleep 和 NSLog 来输出一些标志。然后我发现结果是输出了所有的flags后,六个单元格被关闭在一起了,最不可思议的是他们的动画是这样的:1.最后五个单元格消失,没有动画,2.第一个单元格是空的, 3.淡化第一个单元格空白区域。

但我想要的是一个一个地删除单元格,首先第一个单元格为空并淡化它,然后是第二个,第三个......我该如何解决?

4

1 回答 1

3

问题是您的循环(其中包含sleep对它的调用)正在 UI 线程上运行。UI 不会更新,直到您将 UI 线程的控制权返回给操作系统,以便它可以执行必要的动画。

尝试在不同的线程中运行它,并在 UI 线程上逐个调用删除单元格。代码可能如下所示:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Now we're running in some thread in the background, and we can use it to
    // manage the timing of removing each cell one by one.
    for (int i = 0; i < 5; i++)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            // All UIKit calls should be done from the main thread.
            // Make the call to remove the table view cell here.
        });
        // Make a call to a sleep function that matches the cell removal
        // animation duration.
        // It's important that we're sleeping in a background thread so
        // that we don't hold up the main thread.
        [NSThread sleepForTimeInterval:0.25];
    }
});
于 2013-10-15T02:58:25.357 回答