#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()
Обертывание внутри основной транзакции анимации должно обеспечивать блок завершения, который будет вызван по завершении анимации.