我正在处理UITableView
实例中显示的数据流。在表格视图的顶部添加了新项目。
我面临的问题是,当新项目添加到表格视图时,可以看到动画和手势的轻微中断。在拖动(动画)后拖动表格视图时以及拖动表格视图时,都会发生打嗝。
到目前为止,我已尝试删除任何插入动画,并通过更新表格视图contentOffset
来补偿插入。这些方法似乎都不起作用。
答案 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];
}