1


1

Objective-C:UITableViewで画像のUIActivityインジケーターを取得する

左側に画像があるUITableViewを取得する最良の方法を誰かが知っているのではないかと思っていました。 いくつかのアプリでそれを見てきましたが、その方法を知りたいと思いました。

3 Answer


3


私自身はこれを行っていませんが、画像のロード中にUIActivityインジケーターの表示を処理する独自のUIViewサブクラスを作成することを考えています。 次に、プレーンUIImageViewsではなく、そのビューのインスタンスをテーブルセルに追加します。

更新:OK、前に言ったように、私はこれを自分でやったことがありません。 ブラウザに次のように入力するだけで、スレッドの問題に遭遇するかどうかはわかりませんが、これにアプローチする方法についてのアイデアを提供するはずです。

@interface IndicatorImageView : UIView {
    UIImageView *imageView;
    UIActivityIndicatorView *indicator;
    NSString *imageName;
    NSURL *imageURL;
}
@property (nonatomic, copy) NSString *imageName;
@property (nonatomic, retain) NSURL* imageURL;
@end

@implementation IndicatorImageView
@synthesize imageName;
@synthesize imageURL;
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        imageView = [[UIImageView alloc] initWithFrame:self.bounds];
        [self addSubview:imageView];

        indicator = [[UIActivityIndicatorView alloc] initWithFrame:self.bounds];
        [self addSubview:indicator];
    }
    return self;
}
- (void)setImageName:(NSString *)anImageName {
    if (imageName == anImageName) {
        return;
    }
    [imageName release];
    imageName = [anImageName copy];

    // optionally remove the old image while we're updating
    //imageView.image = nil;

    [indicator startAnimating];
    [self performSelectorInBackground:@selector(updateImageViewUsingImageName) withObject:nil];
}
- (void)setImageURL:(NSURL *)anImageURL {
    if (imageURL == anImageURL) {
        return;
    }
    [imageURL release];
    imageURL = [anImageURL copy];

    // optionally remove the old image while we're updating
    //imageView.image = nil;

    [indicator startAnimating];
    [self performSelectorInBackground:@selector(updateImageViewUsingImageURL) withObject:nil];
}
- (void)updateImageViewUsingImageName {
    NSAutoreleasepool *pool = [[NSAutoreleasePool alloc] init];
    imageView.image = [UIImage imageNamed:imageName];
    [indicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil];
    [pool release];
}
- (void)updateImageViewUsingImageURL {
    NSAutoreleasepool *pool = [[NSAutoreleasePool alloc] init];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
    imageView.image = [UIImage imageWithData:imageData];
    [indicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil];
    [pool release];
}
@end

imageName`プロパティを設定すると、 UIActivityIndi​​catorView`のアニメーション中に画像がバックグラウンドでロードされます。 画像が読み込まれ、 `UIImageView`に設定されると、アクティビティインジケーターのアニメーションを停止します。


1


twitterアカウントからプロフィール写真をロードするときに、スタンフォードの講義cs193、iPhoneアプリケーションプログラミングで示されたようなものを正しく覚えることができれば。

適切なプレゼンテーション(どのプレゼンテーションだったか思い出せません)を見て、テーブルビューについて説明しているメモを見てから、講義のitunesuビデオを見てください。


1


UIImageをサブクラス化し、UIActivityIndi​​catorをサブビューとして追加します。 イメージソースを設定するためのメソッドをクラスに追加し、UIActivityIndi​​catorを適切に開始/停止します。