子类化 UIButton 并覆盖触摸事件 - 不起作用

Posted

技术标签:

【中文标题】子类化 UIButton 并覆盖触摸事件 - 不起作用【英文标题】:Subclassing UIButton and overriding touch events - not working 【发布时间】:2015-06-28 21:33:30 【问题描述】:

我需要一个项目中所有按钮的缩放弹簧动画。 所以我继承了 UIButton 并覆盖了触摸事件函数。

import UIKit

class UIAnimatedButton: UIButton 

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 

    UIView.animateWithDuration(0.1, animations:  () -> Void in
        self.transform = CGAffineTransformMakeScale(0.8, 0.8)

    )
    super.touchesBegan(touches, withEvent: event)



override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) 


    UIView.animateWithDuration(0.5,
        delay: 0,
        usingSpringWithDamping: 0.2,
        initialSpringVelocity: 6.0,
        options: UIViewAnimationOptions.AllowUserInteraction,
        animations:  () -> Void in
            self.transform = CGAffineTransformIdentity
    )  (Bool) -> Void in
        super.touchesCancelled(touches, withEvent: event)
    




override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) 

    UIView.animateWithDuration(0.5,
        delay: 0,
        usingSpringWithDamping: 0.2,
        initialSpringVelocity: 6.0,
        options: UIViewAnimationOptions.AllowUserInteraction,
        animations:  () -> Void in
            self.transform = CGAffineTransformIdentity
        )  (Bool) -> Void in
            super.touchesEnded(touches, withEvent: event)
    
  
 

这在快速点击时效果很好,但是当我长时间触摸按钮(1-2 秒)时,我没有在动作事件中进行修饰。 当我将其切换回常规 UIButton 时,一切正常。

你知道为什么会这样吗?

【问题讨论】:

如果文档没有另外指定,在被覆盖的方法中要做的第一件事就是调用 super.在动画块中调用它有点奇怪。 如果我在动画结束之前调用 super ,动画将不会动画。你有什么方法可以制作这个动画吗? 尝试使用 UIButton 是其子类的 UIControl 类的 beginTrackingWithTouch:withEvent:continueTrackingWithTouch:withEvent:endTrackingWithTouch:withEvent: 方法,而不是覆盖 UIGestureRecognizer 方法。 这不起作用...动画没有被动画化 【参考方案1】:

我没有在 touchesCancelledtouchesEnded 方法的完成块中调用 super,而是在其中调用了 self.sendActionsForControlEvents(UIControlEvents.TouchUpInside)

【讨论】:

【参考方案2】:

目前还不确定具体原因,但您需要在动画外调用super.touchesEnded(touches, with: event)

所以(斯威夫特 5)

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
    UIView.animate(withDuration: 0.5,
        delay: 0,
        usingSpringWithDamping: 0.2,
        initialSpringVelocity: 6.0,
        options: UIView.AnimationOptions.allowUserInteraction,
        animations:  () -> Void in
            self.transform = CGAffineTransform.identity
        )  (Bool) -> Void in
    
    super.touchesEnded(touches, with: event)

【讨论】:

以上是关于子类化 UIButton 并覆盖触摸事件 - 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UIButton 上实现触摸取消

子类化的 SKSpriteNode 触摸事件被忽略

子类化 UIApplication 以覆盖 sendEvent 导致崩溃

如何禁用标准 UIButton 触摸事件

UIWebView 在我的 UITableViewCell 子类中覆盖触摸事件

uiscrollview 和 uibutton 对触摸事件透明