UITableView的deleteRowsAtIndexPaths:withRowAnimation:方法导致动画不规则

11

摘要: 在编辑模式下,我使用自定义编辑控件删除表格视图中的行,而不是默认的红色减号和删除确认按钮。选择一行或多行,然后在工具栏中点击删除按钮。这类似于Mail应用程序中的行为。请参见下面的屏幕截图。

enter image description here

问题: 调用deleteRowsAtIndexPaths:withRowAnimation:产生的动画是不规则的。例如,当我在屏幕截图中使用底部行动画(即UITableViewRowAnimationBottom)删除打勾的行(Subject #7)时,会出现以下情况:

  1. Subject #8滑到Subject #7的下方并被遮盖
  2. Subject #8在Subject #7后面短暂隐藏
  3. Subject #8替换Subject #7,有点突兀

这种情况在模拟器和设备上都发生了。自动动画类型(即UITableViewRowAnimationAutomatic)在删除上面的Subject #7时也会产生相同的不规则行为。

顶部动画类型在模拟器上按预期工作,但在设备上产生不一致、令人不适的动画。

淡入淡出类型的动画是唯一在模拟器和设备上都按预期工作的动画。

细节

我针对iOS 7进行了定位,使用了storyboard、纯自动布局和Core Data。

下面是我删除行的操作方法:

- (void)deleteButtonTapped:(UIBarButton *)sender
{
    // update table view's data
    [self.listOfItems removeObjectsAtIndexes:self.indexSetOfTickedRows];

    // create index paths for ticked rows
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

    [self.indexSetOfTickedRows enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        [indexPaths addObject:[NSIndexPath indexPathForRow:idx inSection:0]];
    }];

    [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationBottom];

    // update Core Data and UI...
}

我尝试过的方法:

表格单元格子类重写了layoutSubviews,但即使我注释掉layoutSubviews,不规则动画仍然存在。

我还从表格单元格中删除了自定义可勾选编辑控件,然后在操作方法中硬编码删除一个特定行。不规则动画仍然存在。

根据其他人的建议,我尝试在调用beginUpdatesendUpdates之间调用deleteRowsAtIndexPaths:withRowAnimation:。这并未解决该问题。

您有什么建议或猜测,为什么我看到这些不规则的动画?

更新(iOS 7.1):

在定位到iOS 7.1后问题仍然存在。将继续使用淡入淡出动画。


1
我遇到了类似的问题,分隔线和单元格内容移动方向不同,导致出现奇怪的动画效果。我也是使用纯自动布局和iOS7。看起来有点buggy。 - Camsoft
我曾经见过这种行为,当线程没有正确处理时会出现。那将是我首先要查看的地方。 - Victor Engel
你不需要调用 beginend 来更新吗? - Remover
我也有同样的问题,有解决方案吗? - user1010819
哇,@bilo,你的界面真漂亮。我知道这有点跑题,但你能分享一些资源吗?比如:1)如何获得一个可爱的黑色勾选图标,最好是图片源或其他什么;2)如何在每个单元格右侧拥有一个漂亮的编辑选择选项,并在其左侧显示一个漂亮的线条?3)你是如何创建底部那个漂亮的条形区域的?我猜它会在你选择另一个单元格时自动更新文本,是通过工具栏和didSelect委托方法实现的吗?也许你可以给我发邮件。 - Pavan
我尝试重新加载表视图的索引路径并将表视图高度调整为0.0f,但仍然面临不规则问题,alpha选项似乎是一个好主意,但我还没有尝试过。很让人沮丧的是,我们无法像邮件或其他苹果应用程序那样进行表视图动画,他们的动画似乎是无缝的。 - lxcid
3个回答

1
尝试在函数末尾而非开头调用[self.listOfItems removeObjectsAtIndexes:self.indexSetOfTickedRows];

0

你的意思是什么?我在你提到的帖子中没有看到任何关于alpha的提及。 - bilobatum
抱歉,我的意思是指上面更新的链接。它对我有点用处,因为即将删除的单元格被隐藏了。这对我来说改善了动画效果,因为否则看起来有些奇怪,因为我有不同高度的单元格。但显然,在iOS6中设置alpha值效果不佳。所以我转而将“hidden”属性设置为“YES”。 - Vijay V S

0
尝试添加 [tableView beginUpdates];[tableView endUpdates];

没有解决问题。我得出结论这是一个 bug。目前,我正在使用淡入淡出动画,它的表现符合预期。 - bilobatum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接