1

touchesMoved画面の特定の領域内でのユーザーのタッチを検出して応答するために、座標系を使用しています。たとえば、仮想キーボードがあり、ユーザーがキーをスワイプすると、座標が読み取られて応答します。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch = [[event allTouches] anyObject];
    CGPoint point = [touch locationInView:touch.view];
    if(point.y < 333 && point.y > 166 && point.x < 90 && point.x > 20)
    {
       //do something
    }
}

...しかし、問題は、ユーザーがキーまたはキー間の境界をゆっくりとドラッグすると、メソッドが連続して数回トリガーされ、ピアノのキー サウンドがスタッターで再生されることです。

どうすればこの吃音を防ぐことができますか? 連続する各 if ステートメントのトリガーの間に 0.25 秒の最小遅延を設定すると役立つと思います。また、この遅延は特定の if ステートメントに対してのみ発生します。ユーザーがキーをすばやくドラッグして、別のキーの if ステートメントを必要なだけすばやくトリガーできるようにしたいと考えています。

このようなコードを書く方法を知っている人はいますか?

4

1 に答える 1

1

これを試して:

BOOL _justPressed; // Declare this in your @interface

...

- (void)unsetJustPressed {
    _justPressed = NO;
}

次に、あなたのtouchesMoved

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (_justPressed) {
        // A key was just pressed, so do nothing.
        return;
    }
    else {
        _justPressed = YES;

        // Do stuff here

        [self performSelector:@selector(unsetJustPressed)
                   withObject:nil
                   afterDelay:0.25];
    }
}

このようにして、呼び出されるたびに (または、何をしたいかによっては、そこにある特定の条件内で) に変数_justPressedを設定し、一定期間後にに設定するために使用するため、いつであるかを確認できます。最近呼び出されたかどうかを確認するために呼び出されます。YEStouchesMoved:withEvent:performSelector:withObject:afterDelay:_justPressedNO_justPressedYEStouchesMoved:

上記の例のようにメソッドから戻る必要はありません_justPressed。サウンドを再生する必要があるかどうかを確認するために使用できますが、他のアクションを実行することもできます。この例は、何をすべきかについての基本的なアイデアを提供するためのものです。

于 2013-06-15T05:12:16.953 に答える