如何使用 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
闭包中。
我正在做一个学习动画的项目,但在使用 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
闭包中。