滚动时滑入UITableViewCells

时间:2013-08-28 08:48:45

标签: ios objective-c uitableview

我有一个UITableView,想要为再次出现的行添加动画效果。我还想在动画之间切换,有些单元格应该UITableViewRowAnimationLeft,其他单元格UITableViewRowAnimationRight。但我不知道如何使用UITableViewController实现此功能。我尝试将以下代码行插入cellForRowAtIndexPath

[self.tableView beginUpdates];
NSArray *updatePath = [NSArray arrayWithObject:indexPath];
[self.tableView reloadRowsAtIndexPaths:updatePath 
                      withRowAnimation:UITableViewRowAnimationLeft];
[self.tableView endUpdates];

而不是在细胞中滑动,细胞的顺序改变或者其中一些出现两次。我还尝试在创建单元格后插入这些行。

if (cell == nil) {
...
} else {
    [self.tableView beginUpdates];
    NSArray *updatePath = [NSArray arrayWithObject:indexPath];
    [self.tableView reloadRowsAtIndexPaths:updatePath 
                          withRowAnimation:UITableViewRowAnimationLeft];
    [self.tableView endUpdates];

1 个答案:

答案 0 :(得分:8)

一旦表格开始在屏幕上显示单元格的过程,我认为你不会重新加载行。 reloadRowsAtIndexPath通常会导致cellForRowAtIndexPath被调用,所以我很惊讶你没有进入无限循环。相反,它似乎正在进入一个糟糕的状态。

我的建议是在这种情况下做自己的动画,在willDisplayCell中操纵单元格的变换属性。你可以这样做:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (<should animate cell>) {
        CGFloat direction = <animate from right> ? 1 : -1;
        cell.transform = CGAffineTransformMakeTranslation(cell.bounds.size.width * direction, 0);
        [UIView animateWithDuration:0.25 animations:^{
            cell.transform = CGAffineTransformIdentity;
        }];
    }
}

您需要为“应该为单元格设置动画”提供逻辑 - 您可能不希望在初始加载时为单元设置动画。