查询当前屏幕上的触摸次数而不使用 iPhone 上的事件

Posted

技术标签:

【中文标题】查询当前屏幕上的触摸次数而不使用 iPhone 上的事件【英文标题】:Querying current number of touches on screen without using events on iPhone 【发布时间】:2010-04-18 12:31:14 【问题描述】:

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

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

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

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

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

UITouch *touches=[self getAllTouchesonScreen];

什么的:)

【问题讨论】:

触摸结束没有正确触发是什么意思?你检查你的代码而不是猜测框架是负责任的吗? touchesBegan、Moved 和 Ended 为您提供屏幕上所有触摸的 NSSet *,因此您可以检查它是否与您的应用认为的触摸次数相匹配... 【参考方案1】:

Touches Ended Event 有时不会被触发。

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

尝试来自 Apple 网站的 GLPaint 示例程序,并尝试在触摸结束时使用 NSLog,然后在屏幕上快速绘制一些图形并快速抬起手指,例如将手指从屏幕上移开。

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

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

【讨论】:

【参考方案2】:
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)中使用此代码,并且可以对触摸进行计数并了解它们的状态。

【讨论】:

【参考方案3】:

不要忘记 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 手动执行此操作,以查看它移动了多远,并在任何点击移动得太远时取消双击/三次点击的能力,并在您处于有效点击状态时计算点击次数。

【讨论】:

以上是关于查询当前屏幕上的触摸次数而不使用 iPhone 上的事件的主要内容,如果未能解决你的问题,请参考以下文章

当用户触摸屏幕时,删除图像上的模糊效果[关闭]

如何检测 UICollectionView 上的触摸?

iPhone设备上的sencha触摸应用程序非常慢

触摸事件

如何将 iPhone 的屏幕在 Mac 上显示出来

iOS中的简单对象拖动