如何避免快速触发UIButtons .touchDragEnter和.touchDragExit函数? This question demonstrates the issue perfectly,但是唯一的答案并未描述如何解决。我试图在用户手指按下按钮时为按钮设置动画,并在用户手指滑开时再次对其进行动画处理。有没有更好的方法可以做到这一点?如果不是,当用户的手指位于.ent和.exit状态之间时,如何停止动画代码多次触发?
最佳答案
相反,您可以跟踪触摸点本身的位置并确定触摸点何时移入和移出按钮
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let point = t.location(in: self)
// moving in to the button
if button.frame.contains(point) && !wasInButton {
// trigger animation
wasInButton = true
}
// moving out of the button
if !button.frame.contains(point) && wasInButton {
// trigger animation
wasInButton = false
}
}
}
wasInButton可以是一个布尔变量,当按钮框内有一个触地得分时,它会设置为true:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let point = t.location(in: self)
if button.frame.contains(point) {
wasInButton = true
// trigger animation
} else {
wasInButton = false
}
}
这将要求您对按钮的超级视图进行子类化。而且由于您可能不希望在该点离开按钮框架后立即进行动画处理(因为用户的手指或拇指仍会覆盖按钮的大部分),因此您可以在封装按钮的更大框架中进行点击测试。