2012-08-17 59 views
1

我正在創建一個應用程序,它正在加載總共大小約200MB的56個圖像,當我在UIScrollView中顯示所有這些圖像時,應用程序花費的時間太長(大約6分鐘)有時會崩潰。應用程序崩潰加載太多的圖像在UIScrollview

請建議我一種方法來使用UIView整理出來並一次加載1張圖片。圖像保存在應用程序中。

+0

什麼是您的ImageView大小? – TheTiger 2012-08-17 12:40:12

+0

其實應用程序類似於iPhone的照片庫應用程序。並且我使用200個320X416的圖像視圖來填充圖像.. – 2012-08-17 12:42:11

+0

然後您需要延遲加載概念....請參閱H2CO3答案! – TheTiger 2012-08-17 12:43:23

回答

0

你需要做的是實現NSOperationQueue預載圖像並設置它的圖像數量,它是第一部分。在NSOperationQueue中,您應該將MaxNumberOfConcurenceOperations設置爲一個小數字。

下一步 - 您應該優化您的圖像!

如果您有56張圖片,大約有200MB,那麼您的圖片大小超過3 MB。您應該使用圖形函數爲您的圖像創建縮略圖。生成的縮略圖應小於100KB。將所有圖像存儲在文件系統中。

而最後一個,最好不要將所有的UIImageView存儲在內存中。相反,請使用UITableView中使用的按需加載技術。

+0

我以完整模式顯示圖像,作爲演示視圖,以整個屏幕顯示。 。「滑動操作」已用於查看「下一張/上一張圖片」。 。 – 2012-08-17 12:52:42

+0

好的Bhardwaj,那麼你應該記憶只有3個兄弟姐妹的圖像。上一個,當前和下一個。如果您使用帶有pagenation的UIScrollView,那麼您應該在endDecelerating上添加委託方法。在這種方法中,你應該從文件和UIImageView作爲子視圖上傳下一個圖像到你的UIScrollView。 – Gloomcore 2012-08-17 13:10:53

1

如果您的圖像視圖大小爲320 * 416像素,則計算內存大小可能爲320 * 416 * 200/1000000 =〜27 MB。

更好的選擇是縮放圖像320個* 416像素:

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize; 

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize { 

    UIImage *sourceImage = self; 
    UIImage *newImage = nil; 

    CGSize imageSize = sourceImage.size; 
    CGFloat width = imageSize.width; 
    CGFloat height = imageSize.height; 

    CGFloat targetWidth = targetSize.width; 
    CGFloat targetHeight = targetSize.height; 

    CGFloat scaleFactor = 0.0; 
    CGFloat scaledWidth = targetWidth; 
    CGFloat scaledHeight = targetHeight; 

    CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 

    if (CGSizeEqualToSize(imageSize, targetSize) == NO) { 

     CGFloat widthFactor = targetWidth/width; 
     CGFloat heightFactor = targetHeight/height; 

     if (widthFactor < heightFactor) 
      scaleFactor = widthFactor; 
     else 
      scaleFactor = heightFactor; 

     scaledWidth = width * scaleFactor; 
     scaledHeight = height * scaleFactor; 

     // center the image 

     if (widthFactor < heightFactor) { 
      thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
     } else if (widthFactor > heightFactor) { 
      thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
     } 
    } 


    // this is actually the interesting part: 

    UIGraphicsBeginImageContext(targetSize); 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.origin = thumbnailPoint; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [sourceImage drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    if(newImage == nil) NSLog(@"could not scale image"); 


    return newImage ; 
} 
1

加載在一個UIScrollView許多圖像是非常不好的做法。無論何時你處理這麼多的內容,你都應該考慮使用UITableViews或者以這種方式處理加載圖像的庫。

我其實寫了一個iOS畫廊,FGallery,你可以找到here

即使使用後臺線程,當您的應用程序僅顯示一個圖像時,即時將56個圖像加載到內存中並不好。這會導致崩潰,鎖定以及整體糟糕的用戶體驗。希望這可以幫助!

相關問題