我有一个包含大图像的 UIScrollView,并且正在使用分页在图像之间滚动。为了节省内存,我只在当前可见的图像之前和之后加载一张图像,并在滚动完成后加载/释放新图像。当快速滚动并且未调用 scrollViewDidEndDecelerating 时会出现问题。当调用 scrollViewDidEndDecelerating 时,我想在活动页面中显示图像名称。
我该如何解决这个问题?为什么会发生这种情况?
我有一个包含大图像的 UIScrollView,并且正在使用分页在图像之间滚动。为了节省内存,我只在当前可见的图像之前和之后加载一张图像,并在滚动完成后加载/释放新图像。当快速滚动并且未调用 scrollViewDidEndDecelerating 时会出现问题。当调用 scrollViewDidEndDecelerating 时,我想在活动页面中显示图像名称。
我该如何解决这个问题?为什么会发生这种情况?
scrollViewDidEndDragging 将在每次滚动完成后调用
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{}
scrollViewDidEndDecelerating 不要在每次拖动中调用(如果你在拖动停止后不以加速速度拖动它不会永远调用这个函数)
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
scrollViewDidEndScrollingAnimation 如果你想移动滚动视图使用 api 而不是拖动,这个 api 将被调用。
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{}
我用滚动视图做同样的事情 - 延迟加载图像。我们实际上必须加载一个被拉伸的缩略图(制作一个模糊的低分辨率版本的图像),然后在页面实际 100% 显示在视图中时加载真实图像。
我必须做的是在scrollViewDidScroll:scrollView 中使用以下代码。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (!_isCurrentlyRotating) {
CGFloat pageWidth = _scrollView.frame.size.width;
int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth)+1;
if (_currentPage != page)
[self setCurrentPage:page];
}
}
以上计算了将要显示的页面(作为您的滚动)。当页面视图显示 50% 时,它实际上会更改当前页码。这可以与页面控件结合使用以突出显示当前页面点。
使用上述方法,(在滚动视图上启用分页)当用户使用手指更改页面(正常行为)时,scrollViewDidEndDecelerating:scrollView 在页面显示为 100% 时被调用。100% 我的意思是你只能看到一页而不是另一页的一部分。
但是我们在滚动视图的末尾有一个“重新开始”按钮,它调用了我的 scrollToPage: 函数。
- (void) scrollToPage:(int)page {
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * page;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
[self.scrollView scrollRectToVisible:frame animated:YES];
}
使用 scrollRectToVisible:animated: 方法不会触发 scrollViewDidEndDecelerating: 方法所以我只是添加了锐化方法(它只是在图像视图中加载高分辨率图像)调用这两个方法,以便在用户滚动或如果重新开始按钮被按下。
- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
[self sharpenImageView];
}
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self sharpenImageView];
}
我希望这有帮助!
检查您UIScrollView
的委托是否已设置,或者是否设置为 nil。
通常以这种方式设置scrollView.delegate = self
。
scrollViewDidEndDecelerating:
并不是要在其中进行页面布局。您应该根据滚动视图来实现scrollViewDidScroll:
和计算当前可见的页面。contentOffset
如果可见范围已更改,请为以前不可见的页面添加视图并删除不再可见的页面。
有时只需清理您的项目并重新运行
Shift & Cmd & K Shift & Cmd & Alt & k