我正在UIScrollView中实现一种“延迟加载”算法。我需要检测页面是否“完全”显示,就像只有一页可见。所以我在用这段代码:

    -(void)scrollViewDidScroll:(UIScrollView *)myScrollView {


float currentPage = ((float)myScrollView.contentOffset.x/ (self.view.frame.size.width));
NSLog([NSString stringWithFormat:@"%.1f", currentPage]);


    if(currentPage >= [[NSNumber numberWithInt:_currentIndex + 1]floatValue])
    {
        _currentIndex = [[NSNumber numberWithFloat:currentPage]intValue];
        NSLog(@"----");
        NSLog([NSString stringWithFormat:@"%d", _currentIndex]);
        [self moveFirstToLast];

    }
    else if (currentPage <= [[NSNumber numberWithInt:_currentIndex - 1]floatValue])
    {
        _currentIndex = [[NSNumber numberWithFloat:currentPage]intValue];
        NSLog(@"----");
        NSLog([NSString stringWithFormat:@"%d", _currentIndex]);
        [self moveLastToFirst];
    }


代码的第一部分没问题。当页面“完全可见”时,UIScrollview会正确检测并执行[self moveFirstToLast]功能。用户执行权限滚动手势时会发生这种情况。

但是,当我快速向左滚动时,有时算法会跳过一步!因此,[self moveLastToFirst]并非总是能按时正确执行。不知道怎么回事任何人?是否有更好的方法来检测页面是否完全显示?

我已经尝试过- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;函数,但是同样的问题,快速滚动时没有调用此方法。

任何帮助将不胜感激!

最佳答案

如果您尝试在用户滚动时实现滚动视图内部视图的重用,则应遵循以下规则:


始终加载上一页,当前页面和下一页(除非您将当前页面作为第一页或最后一页)。
当您在滚动方向上遇到下一页的一半时,应该发生不可见页面的出队和重新排序。例如。用于向左滚动

myScrollView.contentOffset.x <= (0.5f + (_currentIndex - 1)) * myScrollView.bounds.size.width;



UPD 1

3。重用时-您只应移动不可见的页面,而不是将其作为子视图移除/添加到scrollView上。

UPD 2:您也可以尝试使用具有水平滚动的UICollectionView和具有整个页面大小的单元格,而不用实现自己的重用机制。

10-07 19:55
查看更多