touchescancelled被称为而不是touchesended

时间:2012-04-26 00:40:52

标签: ios cocoa-touch uiview

我正试图在触摸时发光,并在触摸结束时将其取下。在执行此操作时,我注意到当我从视图中抬起手指时,未调用- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event方法,而是在视图上调用- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event方法。这是正常的行为吗?我认为如果由于低内存警告等系统问题而取消触摸,则会调用touchesCancelled。我通过使用touchesCancelled完成了我的工作但是我想知道为什么它没有正确地调用touchesEnded。这是一个错误吗?

4 个答案:

答案 0 :(得分:2)

当您触摸该视图并抬起手指时,不应拖动手指。如果你喜欢这样,那么touchesCancelled:方法将被调用。所以我认为你的观点太小,无法触及。如果是,那么制作一个大视图并再次尝试。它会对你有用。

将此视为comment ..

答案 1 :(得分:0)

这不是正常现象。举起手指时,应该调用touchesEnded。

touchesCancelled应该在触摸过程中移除视图或发生系统事件(例如,手指触摸屏幕时锁定手机)时调用

请参阅touchesEndedtouchesCancelled的文档。

没有代码,就无法判断正在发生什么。但是,似乎即使您设法按应有的方式被touchedEnded调用,您都希望对这两种情况都做出响应。迅速:

  ~$  sudo apt -y install cgroupfs-mount
 Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 Package cgroupfs-mount is not available, but is referred to by another  package.
 This may mean that the package is missing, has been obsoleted, or
 is only available from another source

 E: Package 'cgroupfs-mount' has no installation candidate

答案 2 :(得分:0)

我遇到这样一种情况:使用自动UIModalPresentationOverFullScreen呈现文档窗口会导致一个窗口,即使它是模态的,它也可以上下移动一点。当我通过跟踪子视图的父视图的触摸来移动子视图时,只要调用touchsCancelled就足够了。如果我抓住子视图的边缘并且手指移动得太快,则显示的窗口将稍微移动并取消触摸,该触摸被称为touchesCancelled。

答案 3 :(得分:-1)

如果触摸在开始后的第一秒左右移动得不够远,看起来会调用touchesCancelled而不是touchesEnded。如果我进行一次小而快速的动作,那么触碰取消将触发,因为总动作不够大;如果我慢慢做一个小动作,触摸取消将在动作完成之前触发,因为iOS放弃等待看我是否会进一步移动。显然,iOS正在判断移动是多少“重要”,并将小动作视为取消触摸。

如果有帮助,您可以直接从touchesCancelled调用touchesEnded。但是在快速移动的情况下,直到超时时间才会调用,因此在移动实际结束和触发触发的时间之间可能存在延迟。

顺便说一下,我还注意到,如果你做一个小的,快速的动作,然后抬起你的手指,然后开始另一个动作,在触摸被触发之前,这不被认为是一个新的动作,触摸开始不会发射。这使我的应用程序中的手写功能变得复杂,因为手写是关于小而快速的动作。