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];
    }
}

这样,您将变量设置_justPressedYES每个touchesMoved:withEvent:被调用(或在其中的特定条件内,取决于您想要做什么),并且您可以在某个时间段后performSelector:withObject:afterDelay:设置_justPressed为,因此您可以检查是否是被调用以确定它是否最近被调用。NO_justPressedYEStouchesMoved:

请记住,您不必从上面示例中的方法返回,您可以简单地使用_justPressed来检查您是否应该播放声音,但仍然执行您的其他操作。这个例子只是为了让你对做什么有一个基本的了解。

于 2013-06-15T05:12:16.953 回答