0

時間がかかるいくつかの UI 要素をインスタンス化している間に、プログレスバーを更新したいと思います。まず、viewLoad メソッドでビューを作成し、そこにプログレス バーを追加します。ビューが viewDidAppear メソッドに表示されたら、いくつかの uikit オブジェクトのインスタンス化を行っていますが、その間にプログレス バーを更新したいと考えています。UI要素であるため、すべてがメインスレッドで発生する必要があるため、続行する方法がわかりません。

ここに私のコードの一部があります:

-(void) viewDidAppear:(BOOL)animated
{
    // precompute the source and destination view screenshots for the custom segue
    self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]];

    [self.progressBar setProgress:.3];


    SCLViewController *rvc = [[SCLViewController alloc] init];
    UIView *destinationView = rvc.view;
    destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape);


    self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]];

    [self.progressBar setProgress:.5];

}

上記のコードでは、後で使用するビューのスクリーンショットを 2 つ作成するだけです。問題は、進行状況を進行状況バーに設定するときに最後の更新 (.5) しか表示されないことです。この更新を行う適切な方法は何ですか?

4

1 に答える 1

0

重いビューをインスタンス化するために、 performSelectorInBackground:withObject:メソッドを使用できます。そのメソッド (ビューをインスタンス化するメソッド) は、メイン スレッドでプログレス バーの進行状況を設定する必要があります。

したがって、コードは次のようになります。

- (void)viewDidAppear:(BOOL)animated
{
    [self performSelectorInBackground:@selector(instantiateHeavyViews) withObject:nil];
}

- (void)instantiateHeavyViews
{
    self.sourceScreenshotView = [[UIImageView alloc] initWithImage:[self.view pw_imageSnapshot]];
    [self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.3f] waitUntilDone:YES];

    SCLViewController *rvc = [[SCLViewController alloc] init];
    UIView *destinationView = rvc.view;
    destinationView.frame = CGRectMake(0, 0, kWidthLandscape, kHeightLandscape);

    self.destinationScreenshotView = [[UIImageView alloc] initWithImage:[destinationView pw_imageSnapshot]];

    [self performSelectorOnMainThread:@selector(updateMyProgressView:) withObject:[NSNumber numberWithFloat:0.5f] waitUntilDone:YES];
}

- (void)updateMyProgressView:(NSNumber *)progress
{
    [self.progressBar setProgress:[progress floatValue]];
}

編集:もちろん、プログレスバーをアニメーション化することはありません(それがあなたが望んでいたかどうかはわかりません)。ビューが作成されている間に先に進みたい場合は、デリゲートを使用して進行状況を通知する必要がありますが、これは少し難しい場合があります。このようにして、デリゲートに通知されるたびにプログレス バーを更新できます。

于 2012-04-15T10:44:46.777 に答える