我有一个滚动视图,我正在使用页面控件实现lazyload。我已经采用了apple的pagecontrol示例程序。
我在每个页面中加载了8个缩略图,缩略图本身从网络中获取并在UI上更新。图像视图已存在于UI中。在我的viewDidScroll方法中,我计算页码,然后更新其上下的其他页面,如下所示:
BOOL isScrollingDown = verticalScrollView.contentOffset.y > _previousContentOffsetY;
_previousContentOffsetY = verticalScrollView.contentOffset.y;
CGFloat pageHeight = verticalScrollView.frame.size.height;
int scrollingToPageNum = isScrollingDown ? (ceil((verticalScrollView.contentOffset.y - pageHeight) / pageHeight) + 1) : (floor((verticalScrollView.contentOffset.y - pageHeight) / pageHeight) + 1);
int page = floor((verticalScrollView.contentOffset.y - pageHeight / 2) / pageHeight) + 1;
[self loadPage:(page-1)];
[self loadPage:(page)];
[self loadPage:(page+1)];
/* Unloading the pages not seen in the view is done here*/
if (!(isScrollingDown) && scrollingToPageNum >1) {
[self unloadPages:page-2];
}else {
[self unloadPages:page+2];
}
用户界面太慢,用户体验非常糟糕。我想知道如何让UI更具响应性。
其他一些问题是: 1)我有一个下载图像的类,调用类实现下载器类的委托。下载映像后,将调用委托方法来更新UI。这会降低UI的响应速度吗?如何避免这种情况? 2)在没有UI无响应的情况下实现图像下载和更新UI的最佳方法是什么?
编辑: 我对如何最好地改进和实施此解决方案持开放态度。 我没有显式创建线程但我在异步模式下使用NSURLConnection,并且在检索数据时调用委托方法来更新UI。
答案 0 :(得分:4)
我认为您可以从Apple示例LazyTableImages中使用的一些技术中获益匪浅。虽然它使用表视图作为示例,但概念可以轻松应用于滚动视图。
答案 1 :(得分:1)
每次调用scrollViewDidScroll时,您都会多次调用loadPage(至少,我假设您的意思是scrollViewDidScroll)。 loadPage做什么?如果它盲目地触发了一个通信请求,难怪你的应用程序会疯狂 - 你会同时多次请求同样的事情 - 你会看到每个不同的偏移量调用scrollViewDidScroll滚动视图 。
也许您应该考虑使用更合适的委托方法,例如scrollViewDidEndDecelerating:来编排事物。 Mark Adam的回答也是非常好的建议。
这个问题和答案也解释了同样的问题: