查询当前屏幕上的触摸次数而不使用 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 上的事件的主要内容,如果未能解决你的问题,请参考以下文章