1

UIviewには多くの点を描画する必要があるため、UIViewの上にアクティビティインジケータービューを表示したいと思います。

このようなことを試しましたが、うまくいきません。

-(void) drawRect:(CGRect)rect
{
     [self.activityIndicatorView startAnimating];

     CGContextRef cr = UIGraphicsGetCurrentContext();
     // Lots of CG functions (take a few seconds)

     [self.activityIndicatorView startAnimating];
}

描画中にスピニングホイールを表示するにはどうすればよいですか?


ソリューションで編集します(@dasblinkenlightに感謝します):

2つのUIImageView。1つはプレースホルダー(UIActivityIndi​​catorViewが実行される場所)として使用され、もう1つはRendererという名前のCGコンテンツを描画します。

ここで読むように、RendererクラスはUIImageを書き込みます。プレースホルダーが終了したときにdrawrect呼び出しを別のキュー(バックグラウンド)に配置すると、表示される画像を使用できます。

それがコードです:

dispatch_queue_t myQueue = dispatch_queue_create( "MyQueue"、0);

dispatch_async(myQueue, ^{
    [self.renderer drawRect:self.placeholder.bounds];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.placeholder setImage:[self.renderer renderedImage]];
    });
});

setNeedDisplayではなくdrawRect関数を直接呼び出さなければならない理由がわかりません。バックグラウンドで実行されているためでしょうか?

4

1 に答える 1

1

それはできません。drawRect実行中は、画面を他に更新することはできません。回転するギアは、描画または更新される機会がありません。

数秒かかる場合drawRectは、戦略を再検討する必要があります。おそらく、メモリ内のビットマップに描画する関数で描画を多用するコードを分離し、コードによって描画される予定のプレースホルダー画像を使用してを表示することUIImageViewができます。 、バックグラウンドスレッドでレンダリングを行い、の画像をコードでペイントしたものdrawRectに置き換えます。UIImageView

于 2012-09-04T20:29:33.323 に答える