是否可以扩展 UIButton 以便它们都具有默认行为而无需为每个使用 @IBActions?
Is it possible to extend UIButton so they all have a default behaviour without using @IBActions for each?
这可能是一个愚蠢的问题,但我正在努力思考是否有更好的方法来做到这一点。如果我有 10 个 ViewControllers,每个都有一个不同的按钮(假设按钮在 Storyboard 中创建了 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 覆盖吗?
提前致谢,如果这是一个愚蠢的问题,我们深表歉意。
我建议创建子类而不是扩展。例如,如果我想要一些按钮,这些按钮会在触摸时改变 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 等。这取决于您的用例:)
您可以子类化 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
}
}
}
这可能是一个愚蠢的问题,但我正在努力思考是否有更好的方法来做到这一点。如果我有 10 个 ViewControllers,每个都有一个不同的按钮(假设按钮在 Storyboard 中创建了 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.
的 IBActionclass 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 覆盖吗?
提前致谢,如果这是一个愚蠢的问题,我们深表歉意。
我建议创建子类而不是扩展。例如,如果我想要一些按钮,这些按钮会在触摸时改变 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 等。这取决于您的用例:)
您可以子类化 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
}
}
}