合計サイズが約 200MB の 56 個の画像をロードするアプリケーションを作成しています。UIScrollView でこれらすべての画像を表示すると、アプリケーションに時間がかかりすぎて (約 6 分)、クラッシュすることがあります。
UIView を使用して一度に 1 つの画像を読み込む方法を教えてください。画像はアプリケーション内に保存されます。
合計サイズが約 200MB の 56 個の画像をロードするアプリケーションを作成しています。UIScrollView でこれらすべての画像を表示すると、アプリケーションに時間がかかりすぎて (約 6 分)、クラッシュすることがあります。
UIView を使用して一度に 1 つの画像を読み込む方法を教えてください。画像はアプリケーション内に保存されます。
imageviewサイズが320*416ピクセルの場合、計算メモリサイズは320 * 416 * 200/1000000 =〜27MBになります。
より良いオプションは、画像を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 を作成しました。ここで見つけることができます。
バックグラウンド スレッドを使用しても、アプリケーションが 1 つしか表示していないときに一度に 56 個の画像をメモリに読み込むのは適切ではありません。これは、クラッシュ、ロックアップ、および全体的なユーザー エクスペリエンスの低下につながります。お役に立てれば!
あなたがする必要があるのは、画像をプリロードするために NSOperationQueue を実装し、最初の部分である画像の数をそれに設定することです。NSOperationQueue では、MaxNumberOfConcurenceOperations を小さい数に設定する必要があります。
次のステップ - 画像を最適化する必要があります。
約 200MB の画像が 56 個ある場合、1 つの画像のサイズは 3 MB を超えます。画像のサムネイルを作成するには、グラフィック関数を使用する必要があります。生成されるサムネイルは 100KB 未満である必要があります。すべての画像をファイル システムに保存します。
最後に、すべての UIImageView をメモリに保存しない方がよいでしょう。代わりに、UITableView で使用されているようなオンデマンドの読み込み手法を利用してください。