2009-04-21 5 views
0

私は理解できないような固いバグがあり、touchesMovedの実装方法と関係があると思います。touchesMovedとdrawRectの問題

touchesMovedでは、タッチがどこにあるか(ifステートメント)を確認し、それに応じて、タッチポイントの近くの40×40の領域でsetNeedsDisplayWithRectを呼び出します。 DrawRectでは、前に白い画像があった場合は黒い画像が表示され、前の画像が白い画像の場合は黒い画像が表示されます。私はsetNeedsDisplayWithRectを呼び出すと同時にブール変数の配列をブール値に設定しているので、現在のイメージが何であるかを把握することができ、その逆も表示できます。 (実際には、私はいつもイメージを反転させるとは限りません...黒から白への切り替えのような、最初のタッチが何をしようとしているのかを見て、その後のすべてのタッチに白いイメージを置くので、または画像を消去する)。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self]; 
    CGPoint lastTouchPoint = [touch previousLocationInView:self]; 

    touchX = touchPoint.x; 
    touchY = touchPoint.y; 

    int lastX = (int)floor((lastTouchPoint.x+0.001)/40); 
    int lastY = (int)floor((lastTouchPoint.y+0.001)/40); 
    int currentX = (int)(floor((touchPoint.x+0.001)/40)); 
    int currentY = (int)(floor((touchPoint.y+0.001)/40)); 

    if ((abs((currentX-lastX)) >=1) || (abs((currentY-lastY)) >=1)) 
    { 
     if ([soundArray buttonStateForRow:currentX column:currentY] == firstTouchColor){ 
      [soundArray setButtonState:!firstTouchColor row:(int)(floor((touchPoint.x+0.001)/40)) column:(int)(floor((touchPoint.y+0.001)/40))]; 

      [self setNeedsDisplayInRect:(CGRectMake((CGFloat)(floor((touchPoint.x+0.001)/40)*40), (CGFloat)(floor((touchPoint.y+0.001)/40)*40), (CGFloat)40.0, (CGFloat)40.0))]; 
     } 
    } 
} 

私の問題は、論理的な配列が、私が置いている画像でうまくいっていないように見えることです。これは画面全体をすばやくドラッグすると発生します。結局、ブール値の配列と画像は同期していません。同時に設定しても同じです。これを引き起こしていること、または私がそれを修正するために何ができるのか?私はこれに答えを考え出した

- (void)drawRect:(CGRect)rect { 

    if ([soundArray buttonStateForRow:(int)(floor((touchX+0.001)/40)) column:(int)(floor((touchY+0.001)/40))]) 
     [whiteImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))]; 
    else 
     [blackImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))]; 


} 

答えて

0

は、ここに私のdrawRectです。 touchXとtouchYはインスタンス変数で、drawRectの各呼び出しが完了する前にtouchesMovedでリセットされていました。したがって、私が画面上をすばやく移動した場合、touchesMovedが呼び出され、drawRectを呼び出すと、drawRectがtouchXとtouchYを使用する前にtouchesMovedが再度呼び出され、描画がブール配列のバックエンドと同期しなくなります。

これを解決するために、drawRectでtouchXとtouchYの使用を中止し、touchesMovedから渡されていたダーティ矩形を使用して同じ点を派生し始めました。

多田!

+0

ダーティー・レットはどういう意味ですか? –