3

描画領域 (UIView) があり、CGContextRef 内で描画します。
もちろん、私は描くタッチをキャッチしています。drawRect メソッドは既存のオブジェクトをゆっくりと描画しますが、タッチは捕捉されません。
別のスレッドまたは関数「dispatch_async」で drawRect で描画を呼び出すと、適切なコンテキストがないため描画されません。
私はたくさん検索しましたが、何も見つかりませんでした。

dispatch_async(dispatch_get_main_queue(), ^{
    [_mainArea setNeedsDisplay];
});
  • これらのことも役に立ちません。

私に何ができる?タッチをキャッチして、同時にたくさんのオブジェクトを描くのを手伝ってくれる人はいますか?

4

1 に答える 1

8

グラフィックを最新の状態に保つのに問題がある場合、マルチスレッドを開始する前に...

  1. displayまたはへのすべての呼び出しを削除しsetNeedsDisplay、それらを次のように置き換える必要がありますsetNeedsDisplayInRect:

  2. drawRect:ビューの必要な部分のみを再描画するように、メソッドを最適化する必要があります。このメソッドでさらに凝ったrectものを取得し、メソッドからの引数を無視して、から描画される生のrectを取得できgetRectsBeingDrawn:count:ます。

  3. 動くオブジェクトを描く場合は、CoreAnimationを使用してください。

  4. 繰り返されるオブジェクトがたくさんある場合は、CGLayerRefsを使用します

で呼び出すsetNeedsDisplaydispatch_async()、ビューが別のスレッドに描画されることはありません。すべての描画はで行われdrawRect:drawRect:常にメインスレッド/キューによって呼び出されます。

UIGraphicsGetCurrentContext()スレッドセーフではありません。ただし、非同期ブロックにビットマップコンテキストを作成し、ストロークしてそのコンテキストに入力し、このコンテキストをCGImageRefとして取得して、で実行されているCGContextRef(画面と通信しているもの)にコンプすることができますメインスレッド。次のようになります。

@implementation BGDrawingClass : UIVew {
    CGImageRef bgImage;
}

-(void)prepBGImage {

CGRect rect = TheRectISpendALotOfTimeIn();
dispatch_async(_myBGQueue,^{

        CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
        CGContextRef ctx = CGBitmapContextCreate(nil, rect.size.width, rect.size.height, 8, rect.size.width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGImageAlphaPremultipliedLast);
        CGColorSpaceRelease(space);

        /* do expensive drawing in this context */

        bgImage = CGBitmapContextCreateImage(ctx);

        dispatch_async(dispatch_get_main_queue(),^{ 
             [self setNeedsDisplayInRect:rect];
        });
    });
}

-(void)drawRect:(NSRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    /* do drawing behind this ... */
    if (CGRectIntersectsRect(rect, TheRectISpendALotOfTimeIn()) {
        CGContextDrawImage(ctx, TheRectISpendALotOfTimeIn(), bgImage);
    }
    /* do drawing in front of this */
}
@end
于 2013-01-30T18:21:40.923 に答える