UIView Анимация и UIButton перестают работать B / C Home нажал - Swift 4 - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть playButton, который выполняет «анимацию дыхания».Кнопка работает очень хорошо, когда я нажимаю ее.Проблема возникает, если я нажимаю кнопку «Домой» на устройстве, а затем снова открываю приложение.После повторного открытия playButton не имеет «анимации дыхания» и не работает (при нажатии ничего не происходит).

@IBOutlet weak var playButton: UIButton!

override func viewWillAppear(_ animated: Bool) {

    UIView.animate(withDuration: 1.0,
                   delay: 0,
                   options: [.autoreverse, .repeat, .allowUserInteraction],
                   animations: {
                    self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)
    },
                   completion: nil

    )

 }

Я имел дело с этой проблемой в предыдущем игровом приложении, где мне нужно было сохранять и приостанавливать игру, если пользователь нажал кнопку «Домой» или произошел сбой (входящий вызов).Итак, я хорошо осведомлен о:

func applicationDidBecomeActive() {}

func applicationWillResignActive() {}

func applicationDidEnterBackground() {}

Но я не имею отношения к gameState, таймеру, необходимости сохранять данные и т. Д. Я просто хочу, чтобы моя кнопка и ее анимация работали правильно, когдаприложение снова открывается после нажатия кнопки «Домой».

Я также пытался использовать override func viewDidLayoutSubviews() {} вместо viewWillAppear.Но это не сработало.

1 Ответ

0 голосов
/ 23 февраля 2019

Прежде всего, если у вас есть несколько анимаций в одном и том же ViewController (VC), которые появляются после нажатия playButton, это может объяснить, почему он отключается после возврата из фона.Зачем?Я не знаю.Но у меня была похожая проблема, и я решил ее, создав новые class и VC для нескольких анимаций, которые изначально были установлены при нажатии моей UIButton.Внутри моей кнопки IBAction я просто создал переход к новому VC.

Что касается анимации, вы можете подойти к этому двумя способами: 1) приостановить и возобновить анимацию с помощью CALayer ИЛИ 2) просто использовать NotificationCenter, даже не касаясь какого-либо кода AppDelegate.Я предпочитаю простые способы, т.к. это сэкономит время и силы.Итак, попробуйте этот код в VC, где должна происходить анимация кнопки:

override func viewWillAppear(_ animated: Bool) {

    NotificationCenter.default.addObserver(self, selector:#selector(goingToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)

    NotificationCenter.default.addObserver(self, selector:#selector(openingApp), name: UIApplication.willEnterForegroundNotification, object: nil)



    UIView.animate(withDuration: 1.0,
                    delay: 0,
                    options: [.autoreverse, .repeat, .allowUserInteraction],
                    animations: {
                        self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)
                    },
                    completion: nil)
}

@objc func goingToBackground(){
    playButton.transform = .identity
}

@objc func openingApp(){
    self.view.layoutIfNeeded()
    UIView.animate(withDuration: 1.0,
                   delay: 0.3,
                   options: [.autoreverse, .repeat, .allowUserInteraction],
                   animations: {
                    self.playButton.transform = CGAffineTransform(scaleX: 1.175, y: 1.175)}, completion: nil)
    self.view.layoutIfNeeded()

}
...