Вызов обработчика завершения функции из функции выбора таймера Swift - PullRequest
1 голос
/ 24 июня 2019

У меня есть animateButtons() функция, из которой мне нужно установить обработчик завершения только после завершения анимации. Проблема в том, что в animateButtons() я могу установить обработчик завершения только после imageView.startAnimating(), поэтому весь тайм-аут подвергается риску, поскольку его завершение используется для запуска других анимаций. Я прочитал в другом посте с той же самой проблемой, что я должен установить NSTimer для установки обработчика завершения, как я и думал, но не знаю, как это сделать. Я установил NSTimer для вызова функции setCompletion(), но как мне настроить вызов 10000 * обработчика завершения?

Можете ли вы указать мне правильное направление?

Это функция и функция выбора:

static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) {
        imageView.animationImages = images
        imageView.animationDuration = 1.0 // check duration
        imageView.animationRepeatCount = 1
        imageView.startAnimating()

        _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(setCompletion), userInfo: nil, repeats: false)
        // completed(true)
}

@objc func setCompletion() {

}

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Вы можете попробовать использовать встроенный обратный вызов

static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) {
    imageView.animationImages = images
    imageView.animationDuration = 1.0 // check duration
    imageView.animationRepeatCount = 1
    imageView.startAnimating() 
    Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false, block: { (t) in 
        t.invalidate()
        completed(true)
    })
}

Кстати, отправка после может также выполнить работу

static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) {
    imageView.animationImages = images
    imageView.animationDuration = 1.0 // check duration
    imageView.animationRepeatCount = 1
    imageView.startAnimating()
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        completed(true)
    }
}
0 голосов
/ 24 июня 2019

Подход 1 (я предпочитаю этот) (Если вы анимируете изображения Gif) Используйте стороннюю библиотеку, такую ​​как Gifu https://github.com/kaishin/Gifu, чтобы рассчитать время выполнения вашего GIF.Это будет работать, даже если вы в будущем измените изображение GIF.

    static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) {
imageView.prepareForAnimation(withGIFNamed: "welcome", loopCount: 1) {
            self.imageView.startAnimatingGIF()
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.2 + self.imageView.gifLoopDuration, execute: {
                // Do your Task after animation completes
                )
        }
}

Подход 2 (Рассчитайте время запуска анимации и установите таймер)

...