如何避免快速触发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
        }
    }


这将要求您对按钮的超级视图进行子类化。而且由于您可能不希望在该点离开按钮框架后立即进行动画处理(因为用户的手指或拇指仍会覆盖按钮的大部分),因此您可以在封装按钮的更大框架中进行点击测试。

07-28 07:04