2011-04-18 42 views
0

當我在UIScrollView中頻繁滾動圖像,然後在一些圖像之後,下一個圖像需要時間來加載......它沒有花費太多時間,但看起來很奇怪。大圖像的ScrollView滾動速度太慢

假設我在一個scrollView中有27個圖像。當我開始滾動這些圖像時,對於1或2張圖像可以平滑滾動,但當再次滾動以查看第3張圖像時,需要時間加載。然後,當我從第三張圖像開始再次滾動圖像時,它的行爲就像以前一樣。

我一次無法加載全部27張圖片或者我的應用程序崩潰。

當我緩慢滾動scrollview然後我沒有這個問題。

我的代碼如下:

//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

當我看到這個時,我的警鐘響了;

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

除了.frame之前的空格,你是說你的圖片是768x1024?這是巨大的,我懷疑你的問題是記憶問題,而不是代碼問題。

請注意,特別是使用UIImage imageNamed:可能會導致如此大的圖像的悲傷,因爲該方法會將圖像緩存到內存中。您不妨考慮使用每次從文件加載圖像的替代方法。

+0

感謝Roger爲您的迴應。在您的鬧鐘響起的角度,我會說,我已經說我在iphone應用程序開發新。現在,如果簡單地解釋一下,這對我會有幫助。可能我正在花時間,但你知道分享和關心。提前致謝。 – 2011-04-19 04:40:46

+0

值得在這裏閱讀,因爲它有一些代碼示例,並更多地解釋了這個問題。 http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/ – Roger 2011-04-19 08:45:48

0

你應該嘗試使用EGOImageView,它有緩存建立這可能與你的性能問題提供幫助。您可以實施佔位符圖像以向用戶顯示正在準備查看圖像。在顯示圖像之前,圖像將在另一個線程中加載,爲您提供更平滑的滾動性能。 EGOImageView是EGOImageLoading庫的一部分。

https://github.com/tastefulworks/EGOImageLoading

正如你可以創建自己的懶加載機制,加大滾動性能的替代品。例如。一旦用戶停止滾動一秒鐘,開始加載圖像,否則顯示佔位符圖像,如果尚未正確的圖像被緩存。

編輯:思考這個問題更多的時候,我意識到緩存將幫助不大(因爲你已經從磁盤加載圖像),但圖像的異步加載應與滾動性能方面提供幫助,所以利用NSThread或NSOperation在後臺線程中加載圖像,然後通知主線程圖像已加載並準備顯示。

+0

Hi Wolfgang Schreurs,謝謝你寶貴的時間。但如果你解釋它,簡而言之,這對我會有幫助。 – 2011-04-19 04:45:40