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 只调用了一次的主要内容,如果未能解决你的问题,请参考以下文章

一次一密加密解密算法

python将列表里的字符串一次一次显示出来

科学在一次一次的葬礼中进步

touchesBegan,如何获得所有的接触,而不仅仅是第一次或最后一次?

如何将 touchesBegan 和 touchesEnded 限制为仅一次触摸?

线程同步代码块:两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。