0

私には理解できない粘着性のバグがあり、touchesMoved の実装方法に関係があると思います。

touchesMoved では、タッチがどこにあるか (if ステートメント) を確認し、それに応じて、タッチポイントの近くの 40 x 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))];
        }
    }
}

私の問題は、ブール配列が、私が置いている画像とうまくいかないように見えることです。これは、画面上を非常に速くドラッグした場合にのみ発生します。ブール配列と画像を同時に設定しても、最終的には同期しなくなります。これを引き起こしている原因、またはそれを修正するために私にできることはありますか?

これが私の drawRect です:

- (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))]; 


}
4

1 に答える 1

0

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

これを解決するために、drawRect で touchX と touchY を使用するのをやめ、touchesMoved から渡されたダーティ rect を使用して同じポイントを導き出し始めました。

多田!

于 2009-04-24T20:12:47.057 に答える