0

URLから画像を読み込んでから、さまざまなUIButtonの背景画像として割り当てたいと思います。ビューが表示されたときにこれを行う必要があります。

私の問題は、ロード時に画像をフェードインさせようとすると、すべての画像がロードされるまでアニメーションが開始されないことです。これは、アニメーションコードを読み取ったが、実行する前にプログラムが新しい画像の読み込みを開始したためだと思います。

画像を次々にフェードインさせるにはどうすればよいですか?

次のコードを使用して画像を取得し(downloadImageByPrice atURLを呼び出し)、アニメーションを実行します。

-(void) obtainImage:(int)i atURL:(NSString *)URLString{

    UIImage *image = [self downloadImageByPrice:i atURL:URLString];

    // Make images fade in when they have been found
    [[_buttonArray objectAtIndex:i] setAlpha:0.0];

    [[_buttonArray objectAtIndex:i] setImage:image forState:UIControlStateNormal];

    [UIView beginAnimations:@"fadeIn" context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.8];

    [[_buttonArray objectAtIndex:i] setAlpha:1.0];
    [UIView commitAnimations];


}

このメソッドは、すべての画像を次々にロードするために使用されます。次の画像の読み込みを開始する前に、各画像が表示されるまでループを待機させたいです。

-(void) loadAllImagesAtURL:(NSString *)URLString{
    for(int i =0; i<[_buttonArray count];i++){
        [self obtainImage:i atURL:URLString];
    }    
}

セレクター、またはcompletion ^メソッドを使用してみましたが、これらの概念についての理解はまだかなり低いです。

ありがとうございました

4

1 に答える 1

2

これをチェックしてください:

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) NSMutableArray *buttonArray;
-(void) loadAllImagesAtURL:(NSString *)URLString;
- (UIImage *)downloadImageAtURL:(NSString *)urlString;
@end

ViewController.m

#import "ViewController.h"
@implementation ViewController
@synthesize buttonArray = _buttonArray;
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setButtonArray:[NSMutableArray array]];
    int margin = 20;
    int buffer = 8;
    int width  = 100;
    int height = 50;
    for (int i = 0; i < 4; i = i + 1) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setAlpha:0.0];
        [btn setFrame:CGRectMake(margin + ((width + buffer) * i), margin, width, height)];
        [btn setTitle:[NSString stringWithFormat:@"%d", i] forState:UIControlStateNormal];
        [[self buttonArray] addObject:btn];
        [[self view] addSubview:btn];
    }
    [self loadAllImagesAtURL:@"https://www.google.com/images/srpr/logo3w.png"];
}
-(void) loadAllImagesAtURL:(NSString *)URLString {
    static int i = -1;
    i = i + 1;
    if (i < [[self buttonArray] count]) {
        UIImage *image = [self downloadImageAtURL:URLString];
        // Make images fade in when they have been found
        [[_buttonArray objectAtIndex:i] setImage:image forState:UIControlStateNormal];
        [UIView animateWithDuration:1.0
                         animations:^{
                             [[_buttonArray objectAtIndex:i] setAlpha:1.0];
                         } 
                         completion:^(BOOL finished) {

                             [self loadAllImagesAtURL:URLString];
                         }
         ];
    }
}
- (UIImage *)downloadImageAtURL:(NSString *)urlString {
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    return image;
}
@end

私の場合、これにより、画像のダウンロード時にフェードインする4つのボタン(最初は非表示)が作成されます。これは、あなたの望むことですか?

于 2012-05-08T22:29:45.353 に答える