Запретить завершение анимации при закрытии приложения - PullRequest
1 голос
/ 14 апреля 2020

Я получил анимацию, когда машина едет к середине экрана. Когда дойдете, машина останется там, пока я не вернусь к этому виду, затем машина снова вернется. Но когда я закрываю приложение, когда автомобиль находится в середине экрана, и закрываю и снова открываю приложение, автомобиль скрывается в начальной позиции, а НЕ в середине экрана. Я думаю, что анимация завершена, и carImage перешел в исходное положение. Как я могу предотвратить это? Я предполагаю, что мне как-то нужно напоминать положение изображения, когда приложение закрывается, и возвращать автомобиль в это положение, когда приложение снова открывается, но только если автомобиль находился там до закрытия приложения (в противном случае анимация запустится). в середине экрана, что было бы плохо ..).

Я покажу вам короткую запись экрана для лучшего понимания: https://vimeo.com/407626947

Я получил это в моем ViewDidAppear:

 UIView.animate(withDuration: 4, animations: {
                   self.carImage.frame.origin.y += 139
                   self.carImage.frame.origin.x += 240
               }, completion: {(finished:Bool) in self.show()})

где "carImage" - это UIImageView с файлом car.png. Я вручную поместил его положение в main.storyboard где-то слева, чтобы это работало.

Я знаю, что это не очень хорошо, чтобы анимировать это, используя + = 139 и c, но, поскольку я получил carImage внутри вида, который имеет одинаковый размер на всех устройствах, он работает отлично.

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете остановить анимацию блочной анимации UIView, удалив все анимации из слоя вида:

    self.carImage.layer.removeAllAnimations()

Если это само по себе не работает, вы также можете сохранить положение просмотрите перед остановкой анимации и сохраните их, пока приложение находится в фоновом режиме:

    let currentPositionFrame = self.carImage.layer.presentation()?.frame
    self.carImage.layer.removeAllAnimations()

Обратите внимание, что currentPositionFrame будет CGRect?, поэтому вам придется обрабатывать дополнительные функции, но это должно быть разумно, так как вы можете иметь или не иметь предыдущую позицию для carImage, когда вы все равно откроете экран.

ОБНОВЛЕНИЕ:

Чтобы сохранить состояние изображения автомобиля в фоновом режиме, Я обрисую основные его части в контроллере вида:

class MyViewController: UIViewController {
    private var oldCarPosition: CGRect? = nil  // here we'll store the position when the app goes to background

    override func viewDidLoad() {
        super.viewDidLoad()

        // Other setup code

        NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterBackground(_:)), name: UIApplication.willResignActiveNotification, object: nil)

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

    deinit {
        // Don't forget to unsubscribe from notifications!
        NotificationCenter.default.removeObserver(self)
    }


    @objc func applicationWillEnterBackground(_ notification: Notification) {
        self.oldCarPosition = self.carImage.layer.presentation()?.frame
    }

    @objc func applicationWillEnterForeground(_ notification: Notification) {
        guard let oldPosition = self.oldCarPosition else { return }
        self.carImage.frame = oldPosition
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...