UIImageView с обработчиком завершения

#ios #swift #animation

Вопрос:

Я создаю пользовательское представление индикатора активности, и у меня возникают трудности с реализацией анимации, которую я хочу для своего индикатора. В первой части анимации появляются точки. Когда точки появились, следующий набор изображений зацикливается, чтобы указать, что что-то загружается. Наконец, как только условие будет выполнено, оно вызовет представление изображения для анимации последнего набора изображений, в результате чего точки исчезнут. Всего насчитывается 150 изображений.

 let iv = UIImageView()
var isAnimating: Bool = false

func startAnimating() {
    isAnimating = true
    iv.animationImages = (0...40).map { UIImage(named: "loader_($0)")! }
    iv.animationDuration = 40 / 30
    iv.animationRepeatCount = 1
    iv.image = UIImage(named: "loader_40")
    iv.startAnimating()
    DispatchQueue.main.asyncAfter(deadline: .now()   40 / 30) {
        self.iv.image = UIImage.animatedImage(with: (41...110).map { UIImage(named: "loader_($0)")! }, duration: 70 / 30)
        Timer.scheduledTimer(withTimeInterval: 70 / 30, repeats: true) { timer in
            if !self.isAnimating {
                self.iv.animationImages = (111...150).map { UIImage(named: "loader_($0)")! }
                self.iv.image = UIImage(named: "loader_150")
                self.iv.startAnimating()
                timer.invalidate()
            }
        }
    }
}
 

Первые 40 изображений загружаются для начальной анимации. Используя asyncПосле того, как я установил анимационные изображения в массив, содержащий 70 изображений, связанных с анимацией загрузки, затем каждый раз, когда анимация загрузки завершается, вызывается таймер, чтобы проверить, установлено ли логическое значение isAnimating в значение false, чтобы затем установить анимационные изображения для просмотра изображений на последние 40 изображений, которые являются исчезающими точками.

Код работает, однако использование asyncAfter и scheduledTimer для установки новых анимационных изображений для представления изображения не нравится, это идеальное решение. Как я могу создать обработчик завершения для представления изображения, чтобы, когда анимационные изображения закончат воспроизведение, я мог установить для анимационных изображений новое значение.

Ответ №1:

Пожалуйста, попробуйте следующее:

 // Create a Core Animation transaction and set its completion block
CATransaction.begin()
CATransaction.setCompletionBlock {
    NSLog("Animation complete")
}

// create your animations as before
iv.animationImages = (0...40).map { UIImage(named: "loader_($0)")! }
iv.animationDuration = 40 / 30
iv.animationRepeatCount = 1
iv.image = UIImage(named: "loader_40")
iv.startAnimating()

// Commit the transaction    
CATransaction.commit()
 

Обертывание внутри основной транзакции анимации должно обеспечивать блок завершения, который будет вызван по завершении анимации.