我正在創建一個應用程序,它正在加載總共大小約200MB的56個圖像,當我在UIScrollView中顯示所有這些圖像時,應用程序花費的時間太長(大約6分鐘)有時會崩潰。應用程序崩潰加載太多的圖像在UIScrollview
請建議我一種方法來使用UIView整理出來並一次加載1張圖片。圖像保存在應用程序中。
我正在創建一個應用程序,它正在加載總共大小約200MB的56個圖像,當我在UIScrollView中顯示所有這些圖像時,應用程序花費的時間太長(大約6分鐘)有時會崩潰。應用程序崩潰加載太多的圖像在UIScrollview
請建議我一種方法來使用UIView整理出來並一次加載1張圖片。圖像保存在應用程序中。
你需要做的是實現NSOperationQueue預載圖像並設置它的圖像數量,它是第一部分。在NSOperationQueue中,您應該將MaxNumberOfConcurenceOperations設置爲一個小數字。
下一步 - 您應該優化您的圖像!
如果您有56張圖片,大約有200MB,那麼您的圖片大小超過3 MB。您應該使用圖形函數爲您的圖像創建縮略圖。生成的縮略圖應小於100KB。將所有圖像存儲在文件系統中。
而最後一個,最好不要將所有的UIImageView存儲在內存中。相反,請使用UITableView中使用的按需加載技術。
我以完整模式顯示圖像,作爲演示視圖,以整個屏幕顯示。 。「滑動操作」已用於查看「下一張/上一張圖片」。 。 – 2012-08-17 12:52:42
好的Bhardwaj,那麼你應該記憶只有3個兄弟姐妹的圖像。上一個,當前和下一個。如果您使用帶有pagenation的UIScrollView,那麼您應該在endDecelerating上添加委託方法。在這種方法中,你應該從文件和UIImageView作爲子視圖上傳下一個圖像到你的UIScrollView。 – Gloomcore 2012-08-17 13:10:53
如果您的圖像視圖大小爲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 ;
}
加載在一個UIScrollView許多圖像是非常不好的做法。無論何時你處理這麼多的內容,你都應該考慮使用UITableViews或者以這種方式處理加載圖像的庫。
我其實寫了一個iOS畫廊,FGallery,你可以找到here。
即使使用後臺線程,當您的應用程序僅顯示一個圖像時,即時將56個圖像加載到內存中並不好。這會導致崩潰,鎖定以及整體糟糕的用戶體驗。希望這可以幫助!
什麼是您的ImageView大小? – TheTiger 2012-08-17 12:40:12
其實應用程序類似於iPhone的照片庫應用程序。並且我使用200個320X416的圖像視圖來填充圖像.. – 2012-08-17 12:42:11
然後您需要延遲加載概念....請參閱H2CO3答案! – TheTiger 2012-08-17 12:43:23