如何使 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,即使看起来动画已经停止。这可能是由于动画对象的参数发生了一些微小的变化,而这些变化不一定是肉眼可见的。如果发生这种情况,您必须考虑更改一些动画属性,以便动画快速停止而不会摆动。