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

时间:2011-09-07 17:41:51

标签: ios uitableview nsfetchedresultscontroller

这是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];
}

使用此代码,默认分组样式表视图可以很好地使用背景视图更改动画更新其单元格:删除第一个单元格时,第二个单元格成为第一个单元格,其顶角从正方形变为圆形,以及类似的东西。 / p>

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

删除第一行Before deleting

之前

删除第一行After deleting

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

1 个答案:

答案 0 :(得分:0)

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

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

或者您可以考虑屏蔽tableview。因此,您有一个单元格背景,但它们被裁剪,请参阅Round corners on UITableView

相关问题