UIControl子类正在接收“ touchesCancelled”,而不是“ touchesEnded”

时间:2018-09-04 14:23:05

标签: ios swift uicontrol

在我的项目中,我有一个主视图,其中添加了一个UITapGestureRecognizer,在这个主视图中,我有一个子视图,它是一个自定义的UIControl,我将其称为{{ 1}}。

UICustomButton覆盖UICustomButton的以下方法:

UIControl

我遇到的问题是,所有“点击触摸”都触及以下回调:

  • override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) pressAnimation() } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesEnded(touches, with: event) releaseAnimation() listener?.onClick(sender: self) } override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesCancelled(touches, with: event) releaseAnimation() }
  • touchesBegan

touchesCancelled回调未被调用,有点被忽略,我也不知道为什么。

如何通过触摸操作来调用touchesEnded而不是touchesEnded


一些事实:

  • 如果我从父视图中删除了touchesCancelled,一切正常;
  • 即使不调用UITapGestureRecognizer并覆盖所有supers方法,touches也被称为= /;
  • 如果我进行“长时间触摸”或“大动作”,则touchesCancelled被称为:o。

1 个答案:

答案 0 :(得分:2)

这是连接了手势识别器的视图的正确行为。

UIGestureRecognizer文档说:“如果手势识别器识别出其手势,则视图的其余触摸将被取消”:

https://developer.apple.com/documentation/uikit/uigesturerecognizer

属性cancelsTouchesInView(默认为true)确定识别手势后是否取消触摸:

https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview

由于敲击识别器无法识别长按和滑动,因此不会干扰它们。当识别出轻拍时,它进行干预。

如果将识别器的cancelsTouchesInView属性设置为false,则不应取消触摸,并且将像往常一样调用touchesEnded(_:with:)方法。

您可以在代码中或在Interface Builder中设置该属性(如果通过在情节提要板中拖动手势来添加手势识别器)。