UIControl 子类正在接收“touchesCancelled”而不是“touchesEnded”
Posted
技术标签:
【中文标题】UIControl 子类正在接收“touchesCancelled”而不是“touchesEnded”【英文标题】:UIControl subclass is receiving "touchesCancelled" instead of "touchesEnded" 【发布时间】:2018-09-04 14:23:05 【问题描述】:在我的项目中,我有一个主视图,我在其中添加了一个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()
我遇到的问题是,所有“点击触摸”都会触发以下回调:
touchesBegan
touchesCancelled
touchesEnded
回调没有被调用,它有点被忽略了,我不知道为什么。
如何在触摸操作中调用 touchesEnded
而不是 touchesCancelled
?
一些事实:
如果我从父视图中删除UITapGestureRecognizer
,一切正常;
即使不调用 supers
并覆盖所有 touches
方法,也会调用 touchesCancelled
=/;
如果我进行“长按”或“大移动手势”,touchesEnded
被称为 :o。
【问题讨论】:
我认为这个答案可能对您有所帮助:***.com/a/36038660/4981847 【参考方案1】:这是附加了手势识别器的视图的正确行为。
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 中设置该属性(如果您通过在情节提要中拖出手势识别器来添加手势识别器)。
【讨论】:
你好,@PetMorris。非常感谢您的详细回答。它起作用了,touchesEnded()
现在被称为 \o/。但是我现在遇到的问题是两个回调,touchesEnded()
和来自父视图的UITapGestureRecognizer
的一个都被触发了。有什么方法可以只调用UICustomButton
`s 回调?谢谢o/
你必须为你的识别器分配一个代理。查看 UIGestureRecognizerDelegate。它的gestureRecognizer(_:shouldReceive:) 方法返回一个Bool,它说明触摸是否应该由识别器处理。您需要判断触摸的位置,如果它在您的自定义控件的范围内,则从此委托方法返回 false。
非常感谢@PeteMorris 的回复。这就是我所做的。但我想知道是否还有其他方法可以做到这一点。那我会坚持那个解决方案。干杯\o /以上是关于UIControl 子类正在接收“touchesCancelled”而不是“touchesEnded”的主要内容,如果未能解决你的问题,请参考以下文章
目标 C:标签文本(UIControl 的子类)未显示在 UITableview 中