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

Ios7 删除UITableView的最后一行时出现动画问题,ios7,Ios7,更新:这在iOS 8.0及以上版本中已修复。有关详细信息,请参阅我接受的答案 我有一个iOS 7 UITableView,我允许滑动删除行。我正在处理以下方面的删除: tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 与: 除表中的最后一行外,所有行都将使用正确的动画删

更新:这在iOS 8.0及以上版本中已修复。有关详细信息,请参阅我接受的答案

我有一个iOS 7 UITableView,我允许滑动删除行。我正在处理以下方面的删除:

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

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

甚至当所讨论的行是表中唯一的行时,也会发生这种情况,在表中,我删除了整个节,而不仅仅是行。区段标题向上滑入遗忘状态,但带有删除按钮的白色单元格会停留一段时间


我希望最后一个单元格具有与其他单元格相同的UITableViewRowAnimationTop动画。有什么想法吗?

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

作为Frank Li提到的保留空行技巧的替代方法,我通过对最后一行的删除进行特殊处理来解决这个难看的问题:不需要设置单元格动画,只需在表视图上调用-reloadData即可


您不会得到任何动画,但也不会看到小故障,因此您的表视图看起来不会损坏。值得权衡。

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

iOS 7修复程序:
我可以通过在表的末尾添加另一个具有足够高的节标题视图的节来纠正这个问题。这个头视图的样式看起来像表底部的空白区域,所以你看不到它在那里。当删除表的最后一行时,此空白节标题会向上滑动并覆盖它,隐藏卡在那里的删除按钮。这是一个小漏洞,但看起来像是一个表视图错误。

您也可以使用
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
的视图控制器

  • 代码假定为圆弧
  • 如果你在桌子上使用背景图像,情况就不同了
  • 代码可以用“if(iOS>7)”子句包围

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

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

我也看到过同样的问题。我很确定这只是iOS 7中UITableView的一个bug。谢谢你的更新。您可以添加您的更新作为答案吗?如果它充分回答了你的问题,你甚至可以接受它。始终可以插入更好的答案,然后您甚至可以接受该答案。此解决方案将删除通常显示在空表中的行。最好是保留表视图的库存外观的解决方案。目前,这是我唯一明智的解决方案。唯一需要注意的是,我们不能在单元格上使用透明背景。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.hidden = YES;
}