删除UITableView的最后一行时出现动画问题

时间:2013-10-27 04:49:03

标签: ios7

更新:现在已在iOS 8.0及更高版本中修复此问题。有关详细信息,请参阅我接受的答案。

我有一个iOS 7 UITableView,我允许在行上滑动删除。我在处理删除:

tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

使用:

[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];

使用正确的动画删除所有行,但表中的最后一行除外。当用户滑动以显示删除按钮,然后点击它时,单元格完全从屏幕向左滑动,但在后面留下一个白色单元格,删除按钮仍在其上十分之几秒,然后突然消失。似乎所有细胞都在发生这种情况,但是所有其他细胞在它们下面都有一排向上滑动,覆盖它。

当有问题的行是表中的唯一行时,甚至会删除整个部分而不是行。部分标题滑动到遗忘状态,但带有删除按钮的白色单元格会稍微停留一点。

我希望这最后一个单元格具有与其他单元格相同的UITableViewRowAnimationTop动画。对于发生了什么的任何想法?

5 个答案:

答案 0 :(得分:4)

更新:此错误已在iOS 8中得到纠正。最终的单元格删除现在滑向左侧,删除按钮向上滑动,背景清晰(动画完成后不再有白色区域突然消失) )。在iOS 8下运行时仍需要iOS 7以下修复。

iOS 7修复: 我能够通过在表的末尾添加另一个具有足够高的节标题视图的部分来纠正此问题。此标题视图的样式看起来像表格底部的空白区域,因此您无法看到它在那里。当删除表格的最后一行时,这个空白部分标题会向上滑动并隐藏它,隐藏那些卡在那里的删除按钮。这有点像黑客,但它看起来像是一个表视图错误。

答案 1 :(得分:1)

作为Frank Li提到的保持空行技巧的替代方案,我通过简单地排除最后一行的删除来解决这个丑陋的故障:而不是将单元格设置为动画,只需调用表视图上的-reloadData。

你不会得到任何动画,但你也不会看到毛刺,所以你的桌面视图看起来不会破碎。值得权衡。

答案 2 :(得分:0)

我认为一种方法是始终在表格视图的最后一行下方保留一个空行。这样就可以了。

答案 3 :(得分:0)

您还可以使用UITableView.tableFooterView属性:

- (void)viewDidLoad
{
    [super viewDidLoad];

    ... 

    CGRect frame = [self.tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    UIView *view = [[UIView alloc] initWithFrame:frame];
    view.backgroundColor = self.tableView.backgroundColor;
    self.tableView.tableFooterView = view;
}

此代码进入持有UITableView

的视图控制器
  • 代码假设为ARC。
  • 如果您使用背景图片,这是一个不同的故事。
  • 代码可以用“if(iOS> 7)”子句包围。

答案 4 :(得分:0)

我的解决方案是通过隐藏正在删除的单元格来禁用损坏的动画。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.hidden = YES;
}