带有大图像的ScrollView滚动速度太慢

时间:2011-04-18 09:14:12

标签: iphone uiscrollview

当我在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];
        }
    }

2 个答案:

答案 0 :(得分:2)

当我看到这个时,我的警钟响了;

imageView .frame = CGRectMake(x,0,768,1024);

除了.frame之前的空间,你是说你的图像是768x1024吗?那是巨大的,我怀疑你的问题是记忆而不是代码问题。

请注意,特别是使用UIImage imageNamed:可能会导致如此大的图像感到悲伤,因为该方法将图像缓存在内存中。您可能希望考虑使用每次从文件加载图像的替代方法。

答案 1 :(得分:0)

您应该尝试使用EGOImageView,它具有缓存构建,可能有助于解决您的性能问题。您可以实现占位符图像,以向用户显示正在准备查看的图像。在显示之前,图像将加载到另一个线程中,从而为您提供更流畅的滚动性能。 EGOImageView是EGOImageLoading库的一部分。

  

https://github.com/tastefulworks/EGOImageLoading

作为替代方案,您可以创建自己的延迟加载机制来提高滚动性能。例如。一旦用户停止滚动一秒钟,开始加载图像,否则显示占位符图像(如果尚未缓存正确的图像)。

编辑:在仔细考虑这个问题时,我意识到缓存不会有太大帮助(因为你已经从磁盘加载了图像),但异步加载图像应该有助于滚动性能,因此,使用NSThread或NSOperation在后台线程中加载图像,然后通知主线程图像已加载并准备好显示。