如何使用 UIView.animate() 的完成块?

How to use completion block for UIView.animate()?

我正在做一个学习动画的项目,但在使用 UIView.animate(withDuration:) 函数的完成块时遇到了问题。我的动画是一个鞋盒,它从屏幕顶部掉落,落在基座上,然后打开。一旦盒子打开,我希望 UIImageView 开箱即用,增长到屏幕的全尺寸,然后转到下一页,但是在我的动画完成之前调用用于 segueing 的代码的完成处理程序,而 UIImageView 没有'根本没有出现。

这是我的代码:

override func viewDidAppear(_ animated: Bool) {
            
    UIView.animate(withDuration: 1.5, delay: 0.0, options: .curveEaseInOut,
                   animations: {
                    //Opening the box
                    self.shoeBoxImage.shoeBox.animationImages = self.boxOpeningAnimation
                    self.shoeBoxImage.shoeBox.animationDuration = 1.5
                    self.shoeBoxImage.shoeBox.animationRepeatCount = 1
                    self.shoeBoxImage.shoeBox.contentMode = .scaleAspectFill
        
                    self.shoeBoxImage.shoeBox.startAnimating()
        
                    //set to the final image
                    self.shoeBoxImage.shoeBox.image = UIImage(named: "frame13")
    },completion: {_ in
        let nextPage = UIImageView()
        nextPage.frame = CGRect(origin: self.shoeBoxImage.center, size: CGSize(width: 0.0, height: 0.0))
        nextPage.image = UIImage(named: "FirstLoadBackgroundImg.jpeg")
        nextPage.autoresizesSubviews = true
        self.view.addSubview(nextPage)
        self.view.bringSubviewToFront(nextPage)
        UIView.animate(withDuration: 5.0, animations: {
            nextPage.transform = CGAffineTransform(scaleX: 428, y: 926)
        })
        
        self.performSegue(withIdentifier: "FinishedLoading", sender: self)
    })
}

这是我第一次使用动画并以编程方式创建视图,所以如果有人可以解释如何让完成块等待动画完成。为了使 UIImageView 出现并在其全屏后显示动画,请转至下一页,我们将不胜感激。

大小为0, 0。零变换任意比例仍为零。我建议您根本不要使用转换,而只是将最终 frame 设置为您想要的。

例如,

let startFrame = CGRect(x: view.bounds.midX, y: view.bounds.midY, width: 0, height: 0)
let endFrame = view.bounds

let imageView = UIImageView(image: ...)
imageView.contentMode = .scaleAspectFill
view.addSubview(imageView)
imageView.frame = startFrame
UIView.animate(withDuration: 3, delay: 0, options: .curveEaseInOut) {
    imageView.frame = endFrame
} completion: { _ in
    // do something here
}

产生:


顺便说一句,performSegue 可能应该在内部 animate 调用的 completion 闭包中。