0

ALAssetLibrary を使用して、iPhone の写真のような同様のプログラムを開発しています。スクロールビューに画像を読み込もうとしています。アルバムの写真が少ない場合は、すべて正常に機能します。しかし、200 枚以上の写真を含むアルバムを読み込もうとすると、プログラムはエラー メッセージなしで終了しました。この番組知ってる人いますか?スクロールビューをロードするための私のコードは次のとおりです。

- (void)loadScrollView
{
for (UIView *v in [scrollview subviews]) {
    [v removeFromSuperview];
}

CGRect scrollFrame = [self frameForPagingScrollView];
scrollview = [[UIScrollView alloc] initWithFrame:scrollFrame];

CGRect workingFrame = scrollview.frame;
workingFrame.origin.y = 0;

photoCount = [info count];
for(NSDictionary *dict in info) {
    UIImageView *imageview = [[UIImageView alloc] initWithImage:[dict objectForKey:UIImagePickerControllerOriginalImage]];
    [imageview setContentMode:UIViewContentModeScaleAspectFit];
    imageview.frame = workingFrame;

    [scrollview addSubview:imageview];
    [imageview release];
    [scrollview setPagingEnabled:YES];
    [scrollview setDelegate:self];
    [scrollview setAutoresizesSubviews:YES];
    [scrollview setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
    [scrollview setShowsVerticalScrollIndicator:NO];
    [scrollview setShowsHorizontalScrollIndicator:NO];

    workingFrame.origin.x = workingFrame.origin.x + workingFrame.size.width;

}

[self setScrollViewContentSize];
[[self view] addSubview:scrollview];
}

よろしくお願いします!!!

4

3 に答える 3

1

私は個人的にすべてのUIImageViewオブジェクトを自分の に配置UIScrollViewしましたが、現在表示されているオブジェクトのイメージ プロパティのみを設定します (表示されなくなったオブジェクトのイメージ プロパティをクリアします)。数千の画像がある場合、それでさえ無駄すぎるかもしれません (プロパティが設定されていUIImageViewなくても、オブジェクトを保持したくないかもしれません)。オブジェクトimageによって消費されるメモリの重要な問題に対処する簡単なソリューションUIImage:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.delegate = self;

    // all of my other viewDidLoad stuff...
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self loadVisibleImages];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self loadVisibleImages];
}

- (void)loadVisibleImages
{
    CGPoint contentOffset = self.scrollView.contentOffset;
    CGRect  contentFrame  = self.scrollView.bounds;
    contentFrame.origin = contentOffset;

    for (UIImageView *imageView in _imageViews) // _imageViews is (obviously) my array of images 
    {
        if (CGRectIntersectsRect(contentFrame, imageView.frame))
        {
            imageView.image = ... // set the image property
        }
        else
        {
            imageView.image = nil;
        }
    }
}

これは、他の多くのことを行っているコードの一部であるため、実装が大幅に異なることは明らかですが、scrollViewDidScrollどの画像が表示されているかを判断し、画像を適切にロード/アンロードする方法を示しています。オブジェクトも削除/追加したい場合は、さらに変更することもできますが、すべてのオブジェクトをUIImageView活用するのではなく、明らかに「このイメージビューが表示されているか」のロジックを変更する必要があります。frameUIImageView

私があなたのコードを正しく読んでいるかどうかはわかりませんが、すべてのUIImageオブジェクトも辞書に載っていますか? それ自体、かなり贅沢なメモリの使用です。私は通常、実際の画像を永続的なストアに保持します (たとえばDocuments、フォルダーを使用しますが、 Core DataorSQLiteを使用できますが、後者の 2 つは大きな画像のパフォーマンスに大きな影響を与えます)。私がメモリに保持する唯一の画像は、UI によってアクティブに使用されるものです。NSCacheパフォーマンス上の理由から、オブジェクトを使用していくつかの画像を保持しますが、それ以外の場合は、アクティブ メモリではなく永続ストレージから取得します。

于 2012-08-09T17:08:19.517 に答える
0

スクロール ビューの委譲を使用して、現時点で画面に表示される画像を決定し、それらの画像のみをメモリにロードする必要があります。

また、実際の画像サイズよりもはるかに小さい画像を表示している場合は、画像のサイズを変更して小さい方の画像を使用する必要があります。

于 2012-08-09T16:19:15.057 に答える