0

私はiOS開発に不慣れなので、ご容赦ください。基本的なフォトギャラリーを作成しようとしていますが、問題が発生しました。プロジェクトを開始したとき、プロジェクトにすべての画像を含めました。より多くの画像(400以上)を取得した後、サーバーからそれらをロードし始めました。次のコード行を使用して画像の配列を作成しました。

[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.testsite.com/testPic.png"]]]

明らかに、サーバーから400以上の画像の配列がロードされるのをユーザーに待たせることは受け入れられません。

だから私の質問は、プロジェクトに「読み込み中」のような画像を1つ含めた場合、サーバーから実際の画像が読み込まれるまでその画像を表示するにはどうすればよいですか?

テーブルビューとスクロールビューを使って、基本的なグリッドスタイルのフォトギャラリーを作成しています。小さな(サムネイル)画像が数行読み込まれ、クリックすると全画面表示になります。

Xcode 4.3、ARC、ストーリーボードを使用しています。

これが混乱している場合は申し訳ありません!

-シュレッダー2794

4

2 に答える 2

1

メソッドはサブクラス化することUIImageViewです。割り当てるときは、デフォルトの画像(読み込み中の画像)またはを配置しUIActivityIndicator、表示する画像を(別のスレッドで)ダウンロードし、画像がダウンロードされたら表示します。画像のダウンロードをご覧 NSURLRequestください。NSURLConnection

* 編集 *

これが私が開発したコードの例です。これを開始点として使用して、独自の読み込み画像クラスを開発できます。このクラスはNSThread、画像の読み込みに使用することで改善できます。

// ImageLoader.h


#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

/**
 *  @brief  Class that loads an UIImage from a server
 *  @author Nicolas
 */
@interface ImageLoader : UIView 
{
    @private
    NSURLConnection         *connection;
    NSMutableData           *data;
    NSString                *path;
    UIActivityIndicatorView *loading;
    UIImageView             *imageView;
}

@property (nonatomic, retain) UIActivityIndicatorView   *loading;
@property (nonatomic, retain) NSURLConnection           *connection;
@property (nonatomic, retain) NSMutableData             *data;
@property (nonatomic, retain) NSString                  *path;
@property (nonatomic, retain) UIImageView               *imageView;

/**
 *  Load an image from a server an display it
 *  @param URL URL to get the image
 *  @param chemin path to save the image
 *  @author Nicolas
 */
- (void)loadImageFromUrl:(NSString *)URL forPath:(NSString *)chemin;

@end



// ImageLoader.m


#import "ImageLoader.h"


@implementation ImageLoader
@synthesize path, connection, data, loading, imageView;

- (id)init
{
    self = [super init];
    [self setUserInteractionEnabled:YES];
    return self;
}

- (void)loadImageFromUrl:(NSString *)URL forPath:(NSString *)chemin
{
    //if (connection != nil)    [connection release];
    //if (data !=  nil)     [data release];
    //if (path != nil)      [path release];

    self.path = chemin;

    if ([[NSFileManager defaultManager] fileExistsAtPath:chemin])
    {
        if (imageView != nil)
        {
            [imageView removeFromSuperview];
            [imageView release];
        }
        imageView = [[UIImageView alloc] initWithFrame:self.bounds];
        imageView.image = [UIImage imageWithContentsOfFile:chemin];
        [self addSubview:imageView];
    }
    else 
    {
        loading = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20.0f, 20.0f)];
        loading.center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
        [loading setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];
        [loading startAnimating];
        [self addSubview:loading];

        NSURL *myURL = [NSURL URLWithString:[URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];      
        NSURLRequest *request = [NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0f];
        connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    }
}

#pragma mark -
#pragma mark NSURLConnection protocol

- (void)connection:(NSURLConnection *)_connection didReceiveData:(NSData *)_data
{
    if (data == nil)
    {
        data = [[NSMutableData alloc] initWithCapacity:2048];
    }
    [data appendData:_data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)_connection
{
    [data writeToFile:self.path atomically:YES];

    if (imageView != nil)
    {
        [imageView removeFromSuperview];
        [imageView release];
    }

    imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data]];
    imageView.frame = self.bounds;
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    [loading stopAnimating];
    [loading setHidden:YES];
    [self addSubview:imageView];
}

- (void)connection:(NSURLConnection *)_connection didFailWithError:(NSError *)error
{
    [loading stopAnimating];
    [loading release];
}

#pragma mark - Memory management

- (void)dealloc
{
    [connection cancel];
    [connection release];
    [imageView release];
    [path release];
    [data release];
    [super dealloc];
}

@end
于 2012-04-26T18:28:51.933 に答える
1

これを行う最も簡単な方法は、AFNetworkingsetImageWithURL:placeholderImage:を使用することです。これは、カテゴリで提供されますUIImageView(成功/失敗ハンドラーを使用するメソッドでもあります)。

于 2012-04-26T18:38:31.290 に答える