UIControl 子类正在接收 "touchesCancelled" 而不是 "touchesEnded"
UIControl subclass is receiving "touchesCancelled" instead of "touchesEnded"
在我的项目中,我有一个主视图,我在其中添加了一个 UITapGestureRecognizer
,在这个主视图中,我有一个自定义的子视图 UIControl
,我将调用它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()
}
我遇到的问题是,所有 "click touches" 都在触发以下回调:
touchesBegan
touchesCancelled
touchesEnded
回调没有被调用,有点被忽略了,我不知道为什么。
如何在触摸操作中调用 touchesEnded
而不是 touchesCancelled
?
一些事实:
- 如果我从父视图中删除
UITapGestureRecognizer
,一切正常;
- 即使不调用
supers
并覆盖所有 touches
方法,touchesCancelled
也会被调用 =/;
- 如果我执行 "long touch" 或执行 "big moving gesture",
touchesEnded
被称为 :o.
这是附加了手势识别器的视图的正确行为。
UIGestureRecognizer
文档说 "If a gesture recognizer recognizes its gesture, the remaining touches for the view are cancelled":
https://developer.apple.com/documentation/uikit/uigesturerecognizer
属性cancelsTouchesInView
(默认为true
),判断手势识别时是否取消触摸:
https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview
因为长按和轻扫不会被点击识别器识别,所以它不会干扰它们。它仅在识别到点击时进行干预。
如果您将识别器的 cancelsTouchesInView
属性 设置为 false
,则不应取消触摸,并且会照常调用 touchesEnded(_:with:)
方法。
您可以在代码或 Interface Builder 中设置 属性(如果您通过将手势识别器拖出到故事板中来添加它)。
在我的项目中,我有一个主视图,我在其中添加了一个 UITapGestureRecognizer
,在这个主视图中,我有一个自定义的子视图 UIControl
,我将调用它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()
}
我遇到的问题是,所有 "click touches" 都在触发以下回调:
touchesBegan
touchesCancelled
touchesEnded
回调没有被调用,有点被忽略了,我不知道为什么。
如何在触摸操作中调用 touchesEnded
而不是 touchesCancelled
?
一些事实:
- 如果我从父视图中删除
UITapGestureRecognizer
,一切正常; - 即使不调用
supers
并覆盖所有touches
方法,touchesCancelled
也会被调用 =/; - 如果我执行 "long touch" 或执行 "big moving gesture",
touchesEnded
被称为 :o.
这是附加了手势识别器的视图的正确行为。
UIGestureRecognizer
文档说 "If a gesture recognizer recognizes its gesture, the remaining touches for the view are cancelled":
https://developer.apple.com/documentation/uikit/uigesturerecognizer
属性cancelsTouchesInView
(默认为true
),判断手势识别时是否取消触摸:
https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview
因为长按和轻扫不会被点击识别器识别,所以它不会干扰它们。它仅在识别到点击时进行干预。
如果您将识别器的 cancelsTouchesInView
属性 设置为 false
,则不应取消触摸,并且会照常调用 touchesEnded(_:with:)
方法。
您可以在代码或 Interface Builder 中设置 属性(如果您通过将手势识别器拖出到故事板中来添加它)。