带有 allowUserInteraction 的 UIView.animate 仅在动画的最后一帧中启用 UIButton

Posted

技术标签:

【中文标题】带有 allowUserInteraction 的 UIView.animate 仅在动画的最后一帧中启用 UIButton【英文标题】:UIView.animate with allowUserInteraction enables the UIButton only in the animation's final frame 【发布时间】:2018-05-16 22:42:53 【问题描述】:

如果我正在为 UIButton 设置动画并使用 .allowUserInteraction 选项,则可以点击动画结束时的最后一帧区域以与按钮交互,甚至在按钮到达该帧之前。如果按钮在动画的最后一帧之外,点击按钮可见的位置不会触发操作:

UIView.animate(withDuration: 9.0, delay: 0.0, options: [.curveLinear, .allowUserInteraction], animations: 
            self.theButton.frame = CGRect(x: (self.view.frame.width * 0.1), y: self.theButton.frame.origin.y, width: self.theButton.frame.width, height: self.theButton.frame.height)

        , completion: nil)

任何帮助将不胜感激。谢谢!

【问题讨论】:

***.com/questions/6346046/… 可能重复 您看到的是预期的(如果烦人的)行为。视图/图层在动画期间实际上并不移动。相反,它在一个presentationLayer 中移动。视图本身在动画开始时捕捉到它的结束位置。 RanLearns 在他的回答中给了你正确的解决方案。 Here 是一个可能对您有用的答案。 【参考方案1】:

它是 UIButton 没关系。无论是按钮还是图像视图,在动画显示的位置点击它的唯一方法似乎是使用 touchesBegan 并测试对象的 layer.presentation 框架是否包含触摸位置:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        let touch = touches.first!
        let touchLocation = touch.location(in: self.view)

        let buttonFrame = theButton.layer.presentation()!.frame

        if buttonFrame.contains(touchLocation) 
            print("Tapped the button here!")
        
    

【讨论】:

以上是关于带有 allowUserInteraction 的 UIView.animate 仅在动画的最后一帧中启用 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

重复动画重新启动按钮的位置

Swift 2/Xcode 7 beta - 多个位掩码产生错误

带有多个链接的 NSAttributedString 的 UILabel,带有行限制,显示尾部截断,带有未见文本的 NSBackgroundColorAttributeName

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

带有和不带有聚合的 sql 查询

带有滚动的 Div 和带有绝对位置的内容