TouchesBegan 只调用了一次
Posted
技术标签:
【中文标题】TouchesBegan 只调用了一次【英文标题】:TouchesBegan only called once 【发布时间】:2016-10-15 15:39:17 【问题描述】:我遇到了一个烦人的问题。我有一个子类 UIViewController 并且正在使用通常的 -(void)touchesBegan
和 -(void)touchesMoved
... 方法检查触摸事件。无论我尝试什么,它们只在第一次触摸时被调用,其他的被完全忽略。我知道这个问题已经在这里解决了:
Why are UIViewController touchesBegan, touchesMoved & touchesEnded only being called when the first of two touches begins, moves or ends?
但是,那里的解决方案对我不起作用。我在每个视图上都将multipleTouchEnabled
设置为YES
,并在每个子视图上将userInteractionEnabled
设置为NO
,但视图控制器上的主视图是我子类化的。
【问题讨论】:
你为什么没有在 view 上实现touches
方法?
@matt 我已经尝试过通过创建另一个子类和所有内容,发生了完全相同的事情:(
好吧,我向你保证,每个手指都有一个touchesBegan
——一个手指就是一个触摸。你能把问题简化为一个小项目并发布吗?我很乐意看看它并告诉你你做错了什么。这里有太多错误配置的方法。
同样的事情发生了。我发现其他的触摸也记录在 event.alltouches 中,但是这些方法仍然只被调用一次......
【参考方案1】:
我认为问题仅仅是了解touches
事件的工作原理。
触摸是手指,手指是触摸。一次触摸有一个视图——触摸最初发生的视图——这是它在其生命周期中的视图。手指的行为作为一系列触摸事件发送到该视图。
所以现在,假设您只有一个视图,并且 touches
事件在该视图中实现。然后在屏幕上向下的每根手指将调用touchesBegan
一次。但是,如果在手指 2 放下时手指 1已经在屏幕上,显然手指 1 没有开始现在;那已经发生了。所以这个对touchesBegan
的调用将在其touches
集合中只包含手指2,因为那是刚刚开始的手指。如果手指 1 也仍然向下,它将在 事件的 触摸中作为第二个报告,但这不是 its 触摸事件,因此它不会出现在 touches
放。
【讨论】:
阅读我的书可能对你有帮助:apeth.com/iosBook/ch18.html 谢谢,我的问题是 iOS 模拟器实际上只为两个同时触摸调用了一次 touchBegan 方法,因为它们是在同一时间开始的。 是的,在模拟器上测试多个手指是一种高度人工的练习,因为它们是人工手指。 :)【参考方案2】:感谢@matt 的想法。我在一个空项目上尝试过,这些方法仍然只调用了一次。然后我检查了touches
数组,也许它被多次触摸调用一次(我在模拟器上)。然后我检查了event.allTouches
,瞧,有两次触摸。愚蠢的我在模拟器上尝试这个,但也愚蠢的苹果调用 touchesBegan
一次,touches
数组只包含一个元素。
【讨论】:
不,这里没有“愚蠢”的东西。你只是不太了解触摸是如何工作的。我已经在我的回答中进行了解释,并在其他地方向您介绍了我的完整解释。希望有帮助!以上是关于TouchesBegan 只调用了一次的主要内容,如果未能解决你的问题,请参考以下文章
touchesBegan,如何获得所有的接触,而不仅仅是第一次或最后一次?