UIButton 子类@IBAction 不起作用

Posted

技术标签:

【中文标题】UIButton 子类@IBAction 不起作用【英文标题】:UIButton Subclass @IBAction not working 【发布时间】:2014-11-26 14:09:23 【问题描述】:

我为 UIButton 创建了一个子类,因此我可以在点击时获得动画效果,效果有效,但当我尝试将其连接到视图控制器中的 @IBAction 时不起作用。该函数没有被调用。我将子类设置为记分牌中的按钮类。这是我的代码:

import UIKit

class SpringyButton: UIButton 

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) 
        // Drawing code
    
    */

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 

        UIView.animateWithDuration(0.4, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIViewAnimationOptions.AllowUserInteraction, animations: 


            self.layer.transform = CATransform3DMakeScale(0.8, 0.8, 1)


            , completion: nil)

    

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) 


        UIView.animateWithDuration(0.4, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIViewAnimationOptions.AllowUserInteraction, animations: 


            self.layer.transform = CATransform3DMakeScale(1, 1, 1) 


            , completion: nil)

    

    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) 


        UIView.animateWithDuration(0.4, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIViewAnimationOptions.AllowUserInteraction, animations: 


            self.layer.transform = CATransform3DMakeScale(1, 1, 1)


            , completion: nil)

    

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) 


        UIView.animateWithDuration(0.4, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIViewAnimationOptions.AllowUserInteraction, animations: 


            self.layer.transform = CATransform3DMakeScale(1, 1, 1)


            , completion: nil)
    



以及我的 ViewController 中的 IBAction:

@IBAction func test(sender: AnyObject) 

    println("go")

我不确定是什么原因造成的,有什么想法吗?

旁注:我已经读过将 UIButton 子类化并不是一个好主意,将 UIView 子类化并将其与点击手势识别器挂钩会更好吗?

谢谢。

【问题讨论】:

我不会继承 UIButton 来做到这一点。我只是将其添加为操作或其他内容的一部分。 @Fogmeister 试过了,动画不能作为动作正常工作 您绝对可以像正常操作一样执行此操作:D 您只需要为touchUpInsidetouchDownInside 等添加操作...顺便说一句,我会转换按钮本身而不是按钮的层。 我不会在任何–touched... 方法中添加任何动画...这有点奇怪。 @holex 我应该把它放在哪里?在点击手势识别器中不起作用。该按钮应该在点击时按比例缩小,并在手指抬起时按比例缩小。 【参考方案1】:

问题在于您只是覆盖了触摸事件。您必须在覆盖该函数后调用 super 。例如在下面的touchesBegan 函数中:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 

    UIView.animateWithDuration(0.4, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIViewAnimationOptions.AllowUserInteraction, animations: 

            self.layer.transform = CATransform3DMakeScale(0.8, 0.8, 1)


     , completion: nil)
    super.touchesBegan(touches, withEvent: event)

像这样,您必须将 super 添加到您覆盖的所有触摸事件中。如果您遇到任何问题,请告诉我。

【讨论】:

【参考方案2】:

我相信 Interface Builder 只使用 UIButton。所以子类化不会真正起作用。如果您真的想使用您的自定义类,您可以通过编程方式创建它。

let myButton : SpringyButton = SpringyButton()

让我知道这是否有效和/或这是否是您想要的!

【讨论】:

以上是关于UIButton 子类@IBAction 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 UIButton 的目标设置为 IBAction 不起作用(Objective-C)

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

选择的 UIButton 不起作用

iOS:UIButton 的动画文本位置不起作用

UiButton 点击​​在 UIView 上不起作用

iOS UIButton、setEnabled 和 button.hidden 不起作用