如何使 UIImageView 动画等待 dynamicAnimator 行为完成以开始动画
How to make UIImageView animation wait for dynamicAnimator behavior to finish to start animating
我正在为一款应用制作动画,鞋盒从屏幕顶部掉落并落在基座上,然后鞋盒打开。
请问有没有什么方法可以制作开箱动画,等待箱子固定在底座上后再执行开箱动画?
这是我的代码:
//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")
除了检查图像视图的中心位置以设置布尔值,然后使用所述布尔值来确定是否开始动画之外,还有什么方法可以做到这一点?如果是这样,有人可以解释一下该怎么做吗?将不胜感激。
有一个委托方法可用于了解动态动画制作器何时暂停。
将一个对象作为代理分配给动画师
dynamicAnimator.delegate = self
然后实现dynamicAnimatorDidPause
方法。
extension ViewController: UIDynamicAnimatorDelegate {
public func dynamicAnimatorDidPause(_ animator: UIDynamicAnimator) {
//Start your box opening animation here...
}
}
以下摘自 UIDynamicAnimator Apple Developer Documentation。
所有类型的动态动画师都有以下特点:
每个动态动画师都独立于您创建的其他动态动画师
您可以将给定的动态项与多个行为相关联,前提是这些行为属于同一个动画师
动画师会在其所有项目处于静止状态时自动暂停,并在行为参数更改或添加或删除行为或项目时自动恢复
您可以使用 UIDynamicAnimatorDelegate
协议的 dynamicAnimatorDidPause(_:)
和 dynamicAnimatorWillResume(_:)
方法实现一个委托来响应动画师 pause/resumption 状态的变化。
这里你必须注意,动画师可能不会调用 dynamicAnimatorDidPause
,即使看起来动画已经停止。这可能是由于动画对象的参数发生了一些微小的变化,而这些变化不一定是肉眼可见的。如果发生这种情况,您必须考虑更改一些动画属性,以便动画快速停止而不会摆动。
我正在为一款应用制作动画,鞋盒从屏幕顶部掉落并落在基座上,然后鞋盒打开。
请问有没有什么方法可以制作开箱动画,等待箱子固定在底座上后再执行开箱动画?
这是我的代码:
//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")
除了检查图像视图的中心位置以设置布尔值,然后使用所述布尔值来确定是否开始动画之外,还有什么方法可以做到这一点?如果是这样,有人可以解释一下该怎么做吗?将不胜感激。
有一个委托方法可用于了解动态动画制作器何时暂停。
将一个对象作为代理分配给动画师
dynamicAnimator.delegate = self
然后实现dynamicAnimatorDidPause
方法。
extension ViewController: UIDynamicAnimatorDelegate {
public func dynamicAnimatorDidPause(_ animator: UIDynamicAnimator) {
//Start your box opening animation here...
}
}
以下摘自 UIDynamicAnimator Apple Developer Documentation。
所有类型的动态动画师都有以下特点:
每个动态动画师都独立于您创建的其他动态动画师
您可以将给定的动态项与多个行为相关联,前提是这些行为属于同一个动画师
动画师会在其所有项目处于静止状态时自动暂停,并在行为参数更改或添加或删除行为或项目时自动恢复
您可以使用 UIDynamicAnimatorDelegate
协议的 dynamicAnimatorDidPause(_:)
和 dynamicAnimatorWillResume(_:)
方法实现一个委托来响应动画师 pause/resumption 状态的变化。
这里你必须注意,动画师可能不会调用 dynamicAnimatorDidPause
,即使看起来动画已经停止。这可能是由于动画对象的参数发生了一些微小的变化,而这些变化不一定是肉眼可见的。如果发生这种情况,您必须考虑更改一些动画属性,以便动画快速停止而不会摆动。