1

あるビューから別のビューに移動するとき、画像がダウンロードされている限り、2番目のビューにスピナーが表示されるようにします(2番目のビューがすぐに開き、ユーザーがスピナーが終了)。

これが私のコードです:

2番目のビューでは、次のビューが開きます。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];

NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];

    NSLog(@"URL is:%@",urlString);
    NSURL *url=[NSURL URLWithString:urlString];
    [more_info_image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];

    [spinner stopAnimating];
}

スピナーがまったく見えません。私のインターネット接続がとても太いからだとは思いません。一方、ボタンを押してビューが開くのを待つと、少し遅れが見られます。たとえば、画像をダウンロードしようとするときです。

ビューを開き、スピナーを用意し、画像をダウンロードしてから、スピナーを離します。

何か変更する必要がありますか?

4

4 に答える 4

5

メインスレッドでUIActivityIndicatorView使用しているため、 が表示されない場合があります。[NSData dataWithContentsOfURL:url]これにより、イメージがダウンロードされるまでメインスレッドが表示UIActivityIndicatorViewされなくなり、その時点までにイメージが削除されます。

次のようなことをしたいかもしれません:

ただし、これが機能するようにファイルで定義spinnerしてください。*.h

- (void)viewDidLoad
{
   ...

   //This code will make downloadImage run in the background thread
   [self performSelectorInBackground:@(downloadImage) withObject:nil]

   ...
}

- (void) downloadImage{
    NSLog(@"URL is:%@",urlString);
    NSURL *url=[NSURL URLWithString:urlString];
    UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

    //This code will make setImage run in the main thread since it is changing UI
    [more_info_image performSelectorOnMainThread:@selector(setImage:) withObject:downloadedImage waitUntilDone:NO];
    //This code will make stopAnimating run in the main thread since it is changing UI
    [spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];

}

もう 1 つの方法は、Grand Central Dispatchを使用して、次のようなことを行うことです。

- (void)viewDidLoad
{

    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];

    //This is the new GCD code
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
    dispatch_async(queue, ^{
        //This code will run on a background thread
        NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];

        NSLog(@"URL is:%@",urlString);
        NSURL *url=[NSURL URLWithString:urlString];
        UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

        dispatch_sync(dispatch_get_main_queue(), ^{
            //this code runs on the main thread since it is UI changes
            [more_info_image setImage:downloadedImage];

            [spinner stopAnimating];
        });
    });
}
于 2012-12-28T15:11:16.750 に答える
2

viewDidLoadメソッドで画像をダウンロードしているので、画像のダウンロード中にビューが読み込まれなかったため、遅延が発生しているので、これを試してください

ヘッダーファイルにUIActivityIndi​​catorのインスタンスを追加します

UIActivityIndicator *spinner;

実装ファイルで次のようにします

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];
    [self performSelector:@selector(downloadYourImageMethod) withObject:nil afterDelay:1];
}

-(void)downloadYourImageMethod
{
    NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];
    NSURL *url=[NSURL URLWithString:urlString];
    [myIMageview setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];

    [spinner stopAnimating];
}
于 2012-12-28T15:14:58.613 に答える
1

コードを次のように変更します

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center=CGPointMake(160.0,240.0 );
    spinner.hidesWhenStopped=YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];
     [self performSelector:@selector(downloadImage) withObject:nil afterDelay:0.1];
}


-(void)downloadImage
{
NSString *urlString=[NSString stringWithFormat:@"http://mysite.com/projects/test/test.jpg"];

    NSLog(@"URL is:%@",urlString);
    NSURL *url=[NSURL URLWithString:urlString];
    [more_info_image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];

    [spinner stopAnimating];
}
于 2012-12-28T15:09:49.933 に答える
0

場合によっては、ビューをどのように配置するかによってすべてが異なります。スピナーは、ビューがロードされたときに順序の最初になるために、階層に最後に追加する必要があります。これが私の場合の問題でした。これが、この回答に出くわした他の人の助けになることを願っています。:)

于 2013-11-28T01:07:38.970 に答える