Как заставить анимацию UIImageView ждать завершения поведения dynamicAnimator, чтобы начать анимацию
Я работаю над анимацией для приложения, где коробка из-под обуви падает с верхней части экрана и приземляется на пьедестал, затем коробка открывается.
Мне было интересно, есть ли способ сделать анимацию открытия коробки, чтобы дождаться, пока коробка установится на пьедестал, прежде чем выполнять анимацию открытия?
Вот мой код:
//dropping box from off screen and having it stop on the pedestal
dynamicAnimator = UIDynamicAnimator(referenceView: self.view)
//gravity
gravityBehavior = UIGravityBehavior(items: [shoeBoxImage])
dynamicAnimator.addBehavior(gravityBehavior)
//collision
collisionBehavior = UICollisionBehavior(items: [shoeBoxImage])
collisionBehavior.addBoundary(withIdentifier: "Pedestal" as NSCopying, from: CGPoint(x: view.frame.minX, y: 545), to: CGPoint(x: view.frame.maxX, y: 545))
dynamicAnimator.addBehavior(collisionBehavior)
//bouncing effect
bouncingBehavior = UIDynamicItemBehavior(items: [shoeBoxImage])
bouncingBehavior.elasticity = 0.40
dynamicAnimator.addBehavior(bouncingBehavior)
//Load Data Here
Task {
Shoes = try await queryShoes()
}
//Opening the box
shoeBoxImage.shoeBox.animationImages = boxOpeningAnimation
shoeBoxImage.shoeBox.animationDuration = 1.0
shoeBoxImage.shoeBox.animationRepeatCount = 1
shoeBoxImage.shoeBox.contentMode = .scaleAspectFit
shoeBoxImage.shoeBox.startAnimating()
shoeBoxImage.shoeBox.image = UIImage(named: "frame11")
Есть ли способ сделать это, кроме проверки центрального положения изображения, чтобы установить логическое значение, а затем использовать указанное логическое значение, чтобы определить, следует ли начинать анимацию? Если да, то может кто-нибудь объяснить, как это сделать? Это было бы очень признательно.
1 ответ
Существует метод делегата, который вы можете использовать, чтобы узнать, когда динамический аниматор приостанавливается.
Назначить объект делегатом аниматору
dynamicAnimator.delegate = self
а затем реализовать метод.
extension ViewController: UIDynamicAnimatorDelegate {
public func dynamicAnimatorDidPause(_ animator: UIDynamicAnimator) {
//Start your box opening animation here...
}
}
Ниже приведена выдержка из документации разработчика UIDynamicAnimator Apple .
Все типы динамических аниматоров имеют следующие характеристики:
Каждый динамический аниматор не зависит от других создаваемых вами динамических аниматоров.
Вы можете связать данный динамический элемент с несколькими поведениями, при условии, что эти поведения принадлежат одному и тому же аниматору.
Аниматор автоматически приостанавливается, когда все его элементы находятся в состоянии покоя, и автоматически возобновляет работу при изменении параметра поведения или при добавлении или удалении поведения или элемента.
Вы можете реализовать делегат, чтобы реагировать на изменения в статусе паузы/возобновления аниматора, используя
dynamicAnimatorDidPause(_:)
а также
dynamicAnimatorWillResume(_:)
методы
UIDynamicAnimatorDelegate
протокол.
Здесь вы должны отметить, что аниматор может не вызывать
dynamicAnimatorDidPause
даже если казалось бы, что анимация остановилась. Это может быть связано с незначительными изменениями параметров анимированного объекта, которые не обязательно видны глазу. Если это произойдет, вы должны подумать об изменении некоторых свойств анимации, чтобы анимация быстро останавливалась, не качаясь.