1

drawRectカスタムUIViewサブクラス用の複雑なQuartzルーチンがあります。描画には数秒かかる場合があります。UIActivityIndicator描いている間見せたいです。ただし、描画が完了した後、インジケーターの回転を停止する(そして非表示にする)必要があります。

インジケーターのアニメーションを開始してから、performSelector単に呼び出すカスタムメソッドを使用しようとしましたsetNeedsDisplay。私の考えではperformSelector、次の実行ループまで待機しますよね?その場合、私のインジケーターはメインスレッドで開始する時間があります。これは機能しているようですが、アニメーションを停止するために最後にコードを追加するとすぐに、drawRectこのアニメーションが開始する前に終了しているかのように、インジケーターがまったく表示されません。

助言がありますか?

私はこの図面を次のように呼びます。

[self.spinner startAnimating];
[self performSelectorOnMainThread:@selector(redraw) withObject:nil waitUntilDone:YES];//tried both YES and NO here

-(void)redraw{
[self.customView setNeedsDisplay];

}

drawRect:単に最後にこれがあります:

 - (void)drawRect:(CGRect)rect{
  //bunch of drawing
  [self.nav stopSpinner]; // reference to a controller class
   }

self.navオブジェクトにはこれがあります:

 -(void)stopSpinner{
self.spinner.hidden=YES;
[self.spinner stopAnimating];
}

そして、spinnerオブジェクトは最初は次のように作成されます。

    self.spinner=[[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease];
    self.spinner.hidden=YES;
    [self.viewController.view addSubview:self.spinner];
4

1 に答える 1

0

背景スレッドで描画を実行します。これにより、アクティビティインジケーターを表示して、必要に応じてアニメーション化できるだけでなく、描画自体もはるかに高速になります。私のテストでは、バックグラウンドスレッドで描画する複雑なクォーツで10倍の速度の向上が見られました。

そして、それは難しいことではありません。実際、アクティビティインジケーターは必要ないほど高速な場合があります。

コードは次のとおりです。通常のコードを使用して、UIImageViewそのimageプロパティを他のスレッドからのレンダリングされた出力に割り当てることができます。

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

  dispatch_async(queue, ^{

    UIGraphicsBeginImageContext(self.bounds.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    //perform some drawing into this context

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    dispatch_sync(dispatch_get_main_queue(), ^{
        self.imageView.image=viewImage;
    });
});
于 2012-08-09T10:45:41.797 に答える