0

私の iPhone アプリでは、Web サーバーから約 300 の画像 URL を取得しています。UIScrollView にすべての画像を 3x3 の行と列の形式で表示する必要があります。Web サーバーからすべての URL を取得したら、それらを UIImage に変換して画像を表示します。すべて正常に動作しますが、200 枚の画像を読み込んでアプリがクラッシュした後、UIScrollView のメモリの種類の問題をよく読んだので、どうすればこれに対処できますか。Appleのドキュメントも読みましたが、明確ではありません。

4

6 に答える 6

1

これが解決策です。アプリに実装しました。これが私のコードです 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;
}

それが役に立てば幸い..

于 2013-03-15T05:10:28.347 に答える
0

300枚すべての画像を一度にダウンロードし、メモリに保存してUIScrollViewに追加しているような印象を受けます。

LazyLoadと呼ばれる手法があります。これは、すべての画像を一度にロードするのではなく、キューにロードすることを意味します。

このリンクhttp://lazyloadinginuiscrollviewiniphone.blogspot.in/2011/12/iphone-uiscrollview-lazy-image-loading.htmlを参照すると、物事をスムーズに達成するのに役立つ場合があります。

ではごきげんよう。

于 2013-03-14T09:54:41.073 に答える
0

見えなくなった要素を解放していますか?UITableView はそれを行います (それが Sandro が提案した理由です)。UIScrollView の実装でそれを行う必要があります。

これを考慮したグリッドの実装には、UICollectionViewまたはGMGridViewを検討することもできます。

于 2013-03-14T09:56:17.213 に答える
0

Gridview 形式で画像を表示する場合は、PSTCollectionViewを使用できます。また、画像の遅延読み込みにはSDWebImageを使用できます。

于 2013-03-14T09:56:00.097 に答える
-1

あなたがしていることがなぜ問題なのかわかりません。メモリに問題がある可能性があります。その場合、シミュレータとデバイスの結果は異なるはずです。

これがメモリの問題である場合は、スクロール ビューの代わりにテーブル ビューを使用する必要があります。各テーブル ビュー セルに 3 つの画像を配置すると、うまくいくはずです。

Cdt

于 2013-03-14T09:53:10.153 に答える