4

我有一个应用程序,当用户触摸 uiview 时开始播放声音,并在用户在屏幕上滑动手指时更改为不同的音调。当用户抬起手指时声音停止。

我为此使用了 touchesBegan、Moved 和 Ended 事件。

我的问题是触摸结束(和/或取消)有时无法正确触发,即使手指从屏幕上抬起后声音也会继续播放。

因此,作为一种解决方法,我想实现一个计时器来检查屏幕上的触摸次数,如果它为零,它将检查并在播放时停止音频播放器。

我一直在寻找一些可以让我获得触摸次数的代码,例如

UITouch *touches=[self getAllTouchesonScreen];

或者其他的东西 :)

4

3 回答 3

3
NSSet *allTouches = [event allTouches];
for(GLuint index = 0; index < [allTouches count]; ++index)
{
    UITouch *touch = [[allTouches allObjects] objectAtIndex:index];
    if([touch phase] != UITouchPhaseCancelled)
    {
        CGPoint touchPoint = [touch locationInView:self];
        //do something with touchPoint that has state [touch phase]
    }
}

您可以在所有触摸事件函数(touchesBegan、touchesEnded、touchesMoved)中使用此代码,并且可以计算触摸并了解它们的状态。

于 2010-06-01T16:25:13.510 回答
3

Touches Ended Event 有时不会被触发。

我尝试为取消的触摸和结束的事件设置断点,但有时它不会命中。

尝试 Apple 网站上的 GLPaint 示例程序,然后尝试 NSLog 结束并在屏幕上快速绘图并快速抬起手指,例如将手指从屏幕上移开。

你会明白我的意思。我目前的解决方案涉及加速度计:)

提示:我用它来查找所有事件:(void)sendEvent:(UIEvent *)event

于 2010-04-19T06:20:30.940 回答
1

不要忘记touchesCanceled。添加此函数/方法并在触摸结束时对其进行 NSLog 我认为您会发现一些缺失的触摸。

如果您正在寻找点击计数 - 在同一个地方多次点击而不移动手指 - 您可以通过以下方式获得它:

-(void)iPhoneTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *touch = [touches anyObject];
CGPoint touchPosition = [touch locationInView:self];
lastTouchTime = [touch timestamp];
myTouchCount = [touch tapCount];

但我也使用 touchesMoved 手动执行此操作,以查看它移动了多远并取消双击/三次点击(如果任何点击移动得太远)的能力,并在您处于有效点击状态时计数点击。

于 2010-07-07T10:25:51.650 回答