1

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

假设用户开启

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

任何想法我怎么能得到这个?我相信这对其他人也可能有用。我想尽可能干净地做到这一点。

4

2 回答 2

0

This is an early attempt. I feel this is a bit messy..

Self is subclass of 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
{

}
于 2012-11-03T17:19:08.363 回答
0

我有一些关于如何处理这个问题的想法。首先是重新加载感兴趣的单元格,并返回一个轻量级单元格。您可以使用CGBitmapContext将图像数据复制到“外观”单元而不是真实单元中。其次是重新加载数据,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];
于 2012-11-03T17:01:23.200 回答