touchesMovedとのdrawRect通報
-
13-09-2019 - |
質問
私は私が把握することができないようスティッキーバグを持っている、と私はそれがtouchesMovedが実装されている方法とは何かを持っていると思います。
touchesMovedに、私はタッチポイントの近くに40 40による面積にsetNeedsDisplayWithRectを呼び出し、それに応じて、その後(if文)のタッチがどこにあるかを確認します。何の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))];
}
解決
私はこの答えを考え出しました。 touchXと厄介は、インスタンス変数だった、とのdrawRectへの各呼び出しが完了する前に、彼らはtouchesMovedにリセットを取得しました。私は、画面上に高速移動した場合そのため、touchesMovedが呼び出されるでしょう、そしてのdrawRectはtouchXと微妙な使用していた前に、その後touchesMovedは再び呼ばれるになるだろう、のdrawRectを呼び出し、その図面は、ブール配列のバックエンドと同期しなくなるだろう。
これを解決するために、私はのdrawRectでtouchXと厄介を使用して停止し、touchesMovedから渡されていた汚いRECTを使用して同じポイントを導出し始めました。
多田!