私の iPhone アプリでは、Web サーバーから約 300 の画像 URL を取得しています。UIScrollView にすべての画像を 3x3 の行と列の形式で表示する必要があります。Web サーバーからすべての URL を取得したら、それらを UIImage に変換して画像を表示します。すべて正常に動作しますが、200 枚の画像を読み込んでアプリがクラッシュした後、UIScrollView のメモリの種類の問題をよく読んだので、どうすればこれに対処できますか。Appleのドキュメントも読みましたが、明確ではありません。
6 に答える
これが解決策です。アプリに実装しました。これが私のコードです sv_port は私の scrollView です。SDWebImageDownloader クラス ファイルをダウンロードし、プロジェクトにインポートします。プロジェクトに関連するフレームワークを追加します。imageIO.framework、QuartzCore など
今、あなたの .m に追加します
#import "UIImageView+WebCache.h"
#import "SDImageCache.h"
#import "SDWebImageCompat.h"
//function for adding image in your scrollview
-(void)populateImages
{
int x=6,y=6;
for(UIView * view in sv_port.subviews){
if([view isKindOfClass:[UIImageView class]])
{
[view removeFromSuperview]; view = nil;
}
if([view isKindOfClass:[UIButton class]])
{
[view removeFromSuperview]; view = nil;
}
}
for(int p=0;p<[Manufacturer count];p++)
{
UIButton *btnImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
btnImageButton.frame = CGRectMake(x,y,70,70);
[btnImageButton setTag:p];
[btnImageButton addTarget:self action:@selector(nextview:) forControlEvents:UIControlEventTouchUpInside];
UIActivityIndicatorView *spinny = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinny.frame=CGRectMake(btnImageButton.frame.origin.x+25,btnImageButton.frame.origin.y+25, 20, 20);
spinny.backgroundColor=[UIColor clearColor];
[spinny startAnimating];
[sv_port setScrollEnabled:YES];
[sv_port addSubview:spinny];
UIImageView *asyncImageView = [[[UIImageView alloc] initWithFrame:btnImageButton.frame] autorelease];
asyncImageView.backgroundColor=[UIColor clearColor];
CALayer *layer;
layer = asyncImageView.layer;
layer.borderWidth = 0.5;
layer.cornerRadius = 5;
layer.masksToBounds = YES;
[asyncImageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", yourUrl] ] placeholderImage:[UIImage imageNamed:nil] options:0 andResize:CGSizeMake(btnImageButton.frame.size.width,btnImageButton.frame.size.height) withContentMode:UIViewContentModeScaleAspectFit];
asyncImageView.contentMode = UIViewContentModeScaleAspectFit;
[sv_port addSubview:btnImageButton];
[sv_port addSubview:asyncImageView];
int imgCntPort=0;
imgCntPort=(sv_port.frame.size.width/(asyncImageView.frame.size.width));
////NSLog(@"imgport %d",imgCntPort);
if((p+1)%imgCntPort==0)
{
x=5;
y=y+80;
}
else
{
x=x+80;
}
}
sv_port.contentSize = CGSizeMake(0, y);
glob_x =0; glob_y =y;
}
それが役に立てば幸い..
300枚すべての画像を一度にダウンロードし、メモリに保存してUIScrollViewに追加しているような印象を受けます。
LazyLoadと呼ばれる手法があります。これは、すべての画像を一度にロードするのではなく、キューにロードすることを意味します。
このリンクhttp://lazyloadinginuiscrollviewiniphone.blogspot.in/2011/12/iphone-uiscrollview-lazy-image-loading.htmlを参照すると、物事をスムーズに達成するのに役立つ場合があります。
ではごきげんよう。
見えなくなった要素を解放していますか?UITableView はそれを行います (それが Sandro が提案した理由です)。UIScrollView の実装でそれを行う必要があります。
これを考慮したグリッドの実装には、UICollectionViewまたはGMGridViewを検討することもできます。
Gridview 形式で画像を表示する場合は、PSTCollectionViewを使用できます。また、画像の遅延読み込みにはSDWebImageを使用できます。
あなたがしていることがなぜ問題なのかわかりません。メモリに問題がある可能性があります。その場合、シミュレータとデバイスの結果は異なるはずです。
これがメモリの問題である場合は、スクロール ビューの代わりにテーブル ビューを使用する必要があります。各テーブル ビュー セルに 3 つの画像を配置すると、うまくいくはずです。
Cdt