是否可以扩展UIButton,使它们都具有默认行为,而无需对每个按钮都使用@IBActions?

问题描述 投票:0回答:2

这可能是一个愚蠢的问题,但是我正在努力思考是否有更好的方法可以解决此问题。如果我有10个ViewController,每个ViewController都有一个不同的按钮(例如,这些按钮在情节提要中创建了Segues),但是我希望所有这些按钮在点击时都具有简单的效果,则可以这样写:

首先是UIButton的扩展,因此它具有处理动画的方法

extension UIButton {
    func tap(){
    UIButton.animate(withDuration: 0.05, 
                     animations: { self.alpha -= 0.1 },
                     completion: { finish in
                        UIButton.animate(withDuration: 0.1, animations: {
                            self.alpha += 0.1
                     })
    })
}

然后是每个ViewController的IBAction。

class FirstViewController: UIViewController {

    @IBOutlet weak var button: UIButton!

    @IBAction func buttonTouchUpInside(_ sender: Any) {
        button.tap()
    }
}

...

class TenthViewController: UIViewController {
    @IBOutlet weak var button: UIButton!

    @IBAction func buttonTouchUpInside(_ sender: Any) {
        button.tap()
    }    
}

我想知道是否有更好的方法。以所有UIButton都调用tap()的方式扩展UIButton的某种方法。我是否需要为所有目标添加目标?如果我确实使用@IBAction,稍后会被@IBAction覆盖吗?

先谢谢您,如果这是一个愚蠢的问题,对不起。

swift uibutton ibaction
2个回答
1
投票

我建议您创建子类而不是扩展。例如,如果我想使用一些按钮来更改Alpha或触摸时的缩放比例,则可以使用以下命令:

class CustomButton: UIControl {

   override open var isHighlighted: Bool {
    didSet {
        UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseInOut, animations: {
            self.titleLabel.alpha = self.isHighlighted ? 0.3 : 1
            self.transform = self.isHighlighted ? .init(scaleX: 0.98, y: 0.98) : .identity
        }, completion: nil)
    }
  }
}

您可以在isHighlighted中指定该效果。您可以使UIButton成为子类或使用UIControl –这样就可以添加自定义标题标签,imageView等。这取决于您的用例:)


1
投票

您可以继承UIButton并添加自定义行为:

//  MARK: Selection Animated Button
/**
A button which animates when tapped.
*/
open class AnimatedButton: UIButton {
    override public var isHighlighted: Bool {
        get { super.isHighlighted }

        set {
            if newValue && !isHighlighted {
                UIView.animate(withDuration: 0.05,
                               animations: { self.alpha = 0.5 },
                                 completion: { finish in
                                    UIButton.animate(withDuration: 0.1, animations: {
                                        self.alpha = 1.0
                                    })
                })
            }
            super.isHighlighted = newValue
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.