【问题标题】:Animation issue when deleting the last row of UITableView删除 UITableView 的最后一行时的动画问题
【发布时间】:2013-11-06 00:57:45
【问题描述】:

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

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

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

与:

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

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

当有问题的行是表中唯一的行时,甚至会发生这种情况,我删除整个部分而不是仅删除行。部分标题滑到被遗忘的地方,但带有删除按钮的白色单元格会停留一段时间。

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

【问题讨论】:

  • 我已经看到了同样的问题。我很确定这只是 iOS 7 中 UITableView 的一个错误。
  • 感谢您的更新。您可以将更新添加为答案吗?如果它充分回答了您的问题,您甚至可以接受它。始终可以插入更好的答案,然后您甚至可以接受该答案。

标签: ios7


【解决方案1】:

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

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

【讨论】:

  • 目前,这对我来说是唯一明智的解决方案。唯一需要注意的是,我们不能在单元格上使用透明背景。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您也可以使用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】:

    作为 Frank Li 提到的 keep-an-empty-row 技巧的替代方法,我通过简单地删除最后一行的特殊情况来解决这个丑陋的故障:而不是动画单元格,只需调用-reloadData 在表视图上。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2014-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多