Можно ли расширить UIButton, чтобы у всех них было поведение по умолчанию без использования @IBActions для каждого? - PullRequest
0 голосов
/ 18 апреля 2020

Это может быть глупый вопрос, но я пытаюсь обернуть голову, есть ли лучший способ сделать это. Если у меня есть 10 ViewControllers, каждый с отдельной кнопкой (скажем, у кнопок есть сегменты, созданные в раскадровке), но я хочу, чтобы у всех них был простой эффект при нажатии, я бы написал что-то вроде этого:

Во-первых, расширение для 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
                     })
    })
}

, а затем IBAction для каждого отдельного ViewController.

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 так, чтобы все UIButton вызывали tap (). Нужно ли мне добавить цель ко всем из них? Будет ли это переопределено @IBAction позже, если я его использую?

Заранее спасибо и извините, если это глупый вопрос.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Вы можете создать подкласс 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
        }
    }
}
1 голос
/ 18 апреля 2020

Я бы посоветовал сделать подкласс вместо расширения. Например, если я хочу иметь несколько кнопок, которые изменяют альфа или масштаб на ощупь, я использую что-то вроде этого:

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 et c. Это зависит от вашего варианта использования:)

...