插入/删除顶部/底部单元格时更新旧/新顶部/底部单元格的 backgroundView

Posted

技术标签:

【中文标题】插入/删除顶部/底部单元格时更新旧/新顶部/底部单元格的 backgroundView【英文标题】:Update old/new top/bottom cells' backgroundView when inserting/deleting top/bottom cells 【发布时间】:2011-09-07 17:41:50 【问题描述】:

这是NSFetchedResultsControllerDelegate的文档中给出的模板代码:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
    [self.tableView beginUpdates];



- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
    atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 

    switch(type) 
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                            withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
    



- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
    newIndexPath:(NSIndexPath *)newIndexPath 

    UITableView *tableView = self.tableView;

    switch(type) 

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                       withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                       withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
                  atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                       withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                       withRowAnimation:UITableViewRowAnimationFade];
            break;
    



- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    [self.tableView endUpdates];

使用此代码,默认分组样式的表格视图会使用背景视图更改动画很好地更新其单元格:当删除第一个单元格时,第二个单元格将成为第一个单元格,其顶角从方形变为圆形,等等。

但是,对于带有自定义backgroundView 的单元格,表格视图不会为我们做相同的背景视图转换。所以我们会看到这样的事情:

删除第一行之前

删除第一行后

如何通过适当的背景视图更新恢复漂亮的动画?

【问题讨论】:

您是否尝试在删除行后重新加载现在位于顶部的行(使用 [self.tableView reloadRowsAtIndexPaths: withRowAnimation:])? 在这种情况下我可以重新加载行。但是有很多不同的情况,我想要一种通用的方法来处理所有这些情况。现在我在NSFetchedResultsControllerDelegate 方法中使用了非常复杂的代码,我想知道是否有一个魔术触发器可用于将默认分组表视图的漂亮动画应用于自定义分组表视图,或者其他人是否更容易和更聪明的实现。 如果你使用图像作为背景视图,那么你必须让它看起来像你自己。 只在controllerDidChangeContent:中调用[self.tableView reloadData]能正常工作吗?如果是这样,如果重新加载数据成本低,这可能是一个可行的解决方案。 @Danra 但我仍然想要漂亮的动画。 【参考方案1】:

没有内置的简单方法来管理具有自定义单元格背景的分组表视图上的单元格动画。

您要么维护一个需要重绘背景的单元格列表,然后使用[cell.backgroundView setNeedsDisplay]

或者您可以考虑屏蔽表格视图。所以你有一个单元格背景,但它们被剪裁了见Round corners on UITableView

【讨论】:

另外值得一提的是,ios5 中提供了 UITableViewRowAnimationAutomatic,它看起来可能比您使用的淡入淡出动画更好。

以上是关于插入/删除顶部/底部单元格时更新旧/新顶部/底部单元格的 backgroundView的主要内容,如果未能解决你的问题,请参考以下文章

如何对要添加到先前单元格顶部或先前单元格底部的单元格进行排序

如何从 Mac OS 中的 SwiftUI 列表中删除底部/顶部项目填充

标签从顶部底部有额外的空间?

为啥 insetForSectionAtIndex 不影响顶部和底部插入?

设置表格视图单元格的高度以匹配底部到标签栏顶部

使用swift 2仅使用顶部和底部边框的文本字段