UITableView动画在部分之间滚动,同时暂时删除过多的单元格以简化动画

时间:2012-11-03 16:39:34

标签: iphone ios uitableview uiscrollview

在我们的应用程序中,用户可以通过桌面视图外部的一些控件以直观的方式滚动到tableview中的下一部分。某些部分包含许多单元格,滚动动画看起来并不平滑,因为要滚动的单元格太多。为了简单易懂的动画,我们想暂时删除动画过多的单元格。

说用户在

section.0 row.5 out of 100 rows

他想要滚动到

section.1 row.0 out of 100 rows

然后我们希望在滚动动画时跳过所有过多的单元格。所以我们暂时想删除

之间的所有单元格
e.g. section.0 row.10 untill section.0 row.98

我有什么想法可以得到这个?我相信这对其他人也有用。我想尽可能干净。

2 个答案:

答案 0 :(得分:0)

我对如何处理这个问题有一些想法。首先是重新加载感兴趣的细胞,然后返回一个轻量级细胞。您可以使用CGBitmapContext将图像数据复制到“facade”单元格而不是真实单元格。第二种方法是重新加载UITableView的数据,然后不返回感兴趣的行的数据。第三是实际删除行。另一个想法可能是在动画时禁用交互。

重新加载行

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

插入/删除行

[tableView beginUpdate];
[tableView insertRowsAtIndexPaths:*arrayOfIndexPaths* withRowAnimation:*rowAnimation*];
[tableView endUpdate];

[tableView beginUpdate];
[tableView deleteRowsAtIndexPaths:*arrayOfIndexPaths* withRowAnimation:*rowAnimation*];
[tableView endUpdate];

禁用互动:

[UIApplication sharedApplication] beginIgnoringInteractionEvents];

答案 1 :(得分:0)

这是一次早期尝试。我觉得这有点乱。

Self是UITableView的子类

- (void)scrollAndSkipCellsAnimatedToTopOfSection:(NSUInteger)section
{
    CGRect sectionRect = [self rectForHeaderInSection:section];
    CGPoint targetPoint = sectionRect.origin;
    CGFloat yOffsetDiff = targetPoint.y - self.contentOffset.y;
    BOOL willScrollUpwards = yOffsetDiff > 0;

    if(willScrollUpwards)
    {
        [self scrollAndSkipCellsAnimatedUpwardsWithDistance:fabs(yOffsetDiff)];
    }
    else
    {
        [self scrollAndSkipCellsAnimatedDownwardsWithDistance:fabs(yOffsetDiff)];
    }
}

- (void)scrollAndSkipCellsAnimatedUpwardsWithDistance:(CGFloat)distance
{
    // when going upwards contentOffset should decrease

    CGRect rectToRemove = CGRectMake(0,
                             self.contentOffset.y + (self.bounds.size.height * 1.5) - distance,
                             self.bounds.size.width,
                             distance - (self.bounds.size.height * 2.5));

    BOOL shouldRemoveAnyCells = rectToRemove.size.height > 0;

    if(shouldRemoveAnyCells)
    {
        // property on my subclass of uitableview
        // these indexes may span over several sections
        self.tempRemoveIndexPaths = [self indexPathsForRowsInRect:rectToRemove];
    }

    [UIView setAnimationsEnabled:NO];
    [self beginUpdates];
    [self deleteRowsAtIndexPaths:self.tempRemoveIndexPaths withRowAnimation:UITableViewRowAnimationNone];
    [self endUpdates];
    [UIView setAnimationsEnabled:YES];

    [self setContentOffset:CGPointMake(0, self.contentOffset.y - distance) animated:YES];
}

// And then I would probably have to put some logic into
// - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;


- (void)scrollAndSkipCellsAnimatedDownwardsWithDistance:(CGFloat)distance
{

}