递归动画是指在动画完成时再次触发自身,形成循环播放的效果。在Swift中,这通常通过UIView的动画API或Core Animation来实现。
func startRecursiveAnimation(view: UIView) {
UIView.animate(withDuration: 1.0, animations: {
// 动画内容
view.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
view.alpha = 0.5
}) { [weak self] _ in
UIView.animate(withDuration: 1.0, animations: {
// 恢复状态
view.transform = .identity
view.alpha = 1.0
}) { [weak self] _ in
// 递归调用
self?.startRecursiveAnimation(view: view)
}
}
}
func addRecursiveRotationAnimation(to layer: CALayer) {
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotationAnimation.fromValue = 0
rotationAnimation.toValue = CGFloat.pi * 2
rotationAnimation.duration = 2.0
rotationAnimation.repeatCount = .infinity
layer.add(rotationAnimation, forKey: "rotationAnimation")
}
原因:在闭包中强引用self导致循环引用
解决方案:使用[weak self]
捕获列表
UIView.animate(withDuration: 1.0, animations: {
// 动画代码
}) { [weak self] _ in
self?.startNextAnimation()
}
原因:递归调用堆栈过深或动画计算复杂
解决方案:
原因:缺少停止机制
解决方案:添加标志位控制递归
private var shouldContinueAnimating = true
func startRecursiveAnimation(view: UIView) {
guard shouldContinueAnimating else { return }
UIView.animate(withDuration: 1.0, animations: {
view.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
}) { [weak self] _ in
self?.startRecursiveAnimation(view: view)
}
}
func stopAnimation() {
shouldContinueAnimating = false
}
func startPropertyAnimatorAnimation(view: UIView) {
let animator = UIViewPropertyAnimator(duration: 1.0, curve: .easeInOut) {
view.transform = CGAffineTransform(translationX: 100, y: 0)
}
animator.addCompletion { [weak self] _ in
let returnAnimator = UIViewPropertyAnimator(duration: 1.0, curve: .easeInOut) {
view.transform = .identity
}
returnAnimator.addCompletion { [weak self] _ in
self?.startPropertyAnimatorAnimation(view: view)
}
returnAnimator.startAnimation()
}
animator.startAnimation()
}
func startCombinedAnimations(view: UIView) {
// 缩放动画
UIView.animate(withDuration: 0.5, animations: {
view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
}) { _ in
// 旋转动画
UIView.animate(withDuration: 0.5, animations: {
view.transform = view.transform.rotated(by: CGFloat.pi/2)
}) { _ in
// 恢复动画
UIView.animate(withDuration: 0.5, animations: {
view.transform = .identity
}) { [weak self] _ in
self?.startCombinedAnimations(view: view)
}
}
}
}
递归动画是Swift中实现复杂动画效果的有力工具,合理使用可以创建出流畅的用户体验,但需要注意内存管理和性能优化。
没有搜到相关的文章