如何在滚动时在表视图中插入表视图单元格?

时间:2014-03-12 12:14:58

标签: ios uitableview scroll

我正在处理UITableView实例中显示的数据流。在表格视图的顶部添加了新项目。

我面临的问题是,当新项目添加到表格视图时,可以看到动画和手势的轻微中断。在拖动(动画)后拖动表格视图时以及拖动表格视图时,都会发生打嗝。

到目前为止,我已尝试删除任何插入动画,并通过更新表格视图contentOffset来补偿插入。这些方法似乎都不起作用。

1 个答案:

答案 0 :(得分:1)

我刚刚想出了这个问题。当它到达最后一行时,我试图向tableView添加新行。你不能随时做到这一点,或者你最终得到一个不稳定的动画或者在tableView动画上突然停止。

我发现在动画(或用户拖动手势)结束之前你无法启动beginAnimations / endAnimations块。为此,您必须检查两种方法:

- -(void)scrollViewDidEndDragging:willDecelerate: :这会告诉您用户何时停止拖动tableView,可能在tableView的末尾。如果willDecelerate为NO,则告诉您用户是"持有"它的手指放在tableView上,刚刚抬起它。这是添加行的好地方。您可以下载Twitter应用程序以查看此示例。试着把手指放在最后一排。在您解除推文之前,该应用不会更新推文。

-(void)scrollViewDidEndDecelerating: 这将告诉您用户已触及表格视图并正在减速,可能在表格视图的末尾。这是一个更新tableView的好地方。

看看这个代码示例:

-(void)shouldUpdateOnScrollView:(UIScrollView*)scrollView{
    // Check if we are at the end of the tableView
    CGFloat currentOffset = scrollView.contentOffset.y;
    CGFloat maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

    // Change 10.0 to adjust the distance from bottom you want to check for
    if (maximumOffset - currentOffset <= 10.0) {
        // Do not throw an update if we are just updating
        if (!_loading &&  !_allDownloaded) {
            _loading = YES;
            // dispatch_async just to not break the current animation
            dispatch_async(dispatch_get_main_queue(), ^{
                [self obtainNextPostsFromBegining:NO];
            });

        }
    }
}


-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSLog(@"%@ %@",NSStringFromSelector(_cmd),decelerate?@"YES":@"NO");
    if (!decelerate) {
        // the user has just lifted it's finger. Check if we have to update
        [self shouldUpdateOnScrollView:scrollView];
    }

}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
        NSLog(@"%@",NSStringFromSelector(_cmd));
    // the tableView has just stopped. Check if we have to update
    [self shouldUpdateOnScrollView:scrollView];
}