当我在UIScrollView中频繁滚动图像然后在一些图像之后,下一个图像需要时间来加载...它不会占用太多时间但看起来很奇怪。
假设我在scrollView中有27个图像。当我开始滚动这些图像时,对于1或2个图像,它会平滑滚动,但是当我再次滚动以查看第3个图像时,需要时间来加载。然后当我开始从第3张图像再次滚动图像时,它的行为就像之前一样。
我无法一次加载所有27张图片或我的应用崩溃。
当我慢慢地滚动滚动视图时,我没有这个问题。
我的代码如下:
//Taking image view for 27 images;
int x=0;
for(int i = 1; i<=27; i++) {
imageView = [[UIImageView alloc] init];
imageView .frame = CGRectMake(x,0,768,1024);
imageView.tag=i;
imageView.image=nil;
imageView.userInteractionEnabled=YES;
[contentView addSubview:imageView];
x+=768;
}
//setContentOffset of the scrollView -->ContentView
[contentView setContentOffset: CGPointMake((imageNumber-1)*768, 0) animated: YES];
//desire image which i want to see from the start of the scrollview
pageNumber=imageNumber;
int pageBefore=pageNumber-1;
int pageAfter=pageNumber+1;
//Views for image
for( UIImageView * views in [contentView subviews]){
if(views.tag==pageNumber){
if(views.image==nil){
NSLog(@"entering");
views.image=[UIImage imageNamed:[ NSString stringWithFormat:@"%d.jpg",pageNumber]];
[views.image release];
}
}
if(views.tag==pageBefore){
if(views.image==nil){
views.image=[UIImage imageNamed:[ NSString stringWithFormat:@"%d.jpg",pageBefore]];
[views.image release];
}
}
if(views.tag==pageAfter){
if(views.image==nil){
views.image=[UIImage imageNamed:[ NSString stringWithFormat:@"%d.jpg",pageAfter]];
[views.image release];
}
}
答案 0 :(得分:2)
当我看到这个时,我的警钟响了;
imageView .frame = CGRectMake(x,0,768,1024);
除了.frame之前的空间,你是说你的图像是768x1024吗?那是巨大的,我怀疑你的问题是记忆而不是代码问题。
请注意,特别是使用UIImage imageNamed:可能会导致如此大的图像感到悲伤,因为该方法将图像缓存在内存中。您可能希望考虑使用每次从文件加载图像的替代方法。
答案 1 :(得分:0)
您应该尝试使用EGOImageView,它具有缓存构建,可能有助于解决您的性能问题。您可以实现占位符图像,以向用户显示正在准备查看的图像。在显示之前,图像将加载到另一个线程中,从而为您提供更流畅的滚动性能。 EGOImageView是EGOImageLoading库的一部分。
作为替代方案,您可以创建自己的延迟加载机制来提高滚动性能。例如。一旦用户停止滚动一秒钟,开始加载图像,否则显示占位符图像(如果尚未缓存正确的图像)。
编辑:在仔细考虑这个问题时,我意识到缓存不会有太大帮助(因为你已经从磁盘加载了图像),但异步加载图像应该有助于滚动性能,因此,使用NSThread或NSOperation在后台线程中加载图像,然后通知主线程图像已加载并准备好显示。