Skip to content

11.3_同步执行缩放、旋转和移动动画

动画组的强大之处 💪

CAAnimationGroup 让你能够将多个独立的动画效果完美地结合在一起,形成一个统一的动画单元。想象一下,你想要一个视图在缩放的同时进行旋转和移动,如果单独处理这些动画,代码会变得非常复杂且难以管理。但有了动画组,这一切都变得轻而易举!你将体验到前所未有的流畅动画开发体验。

创建并配置动画实例 ✨

要实现同步的缩放、旋转和移动,你需要为每种效果创建独立的 CABasicAnimation 实例。

  • 缩放动画: 创建一个 CABasicAnimation,并将其 keyPath 设置为 "transform.scale"。你可以定义 fromValuetoValue 来控制缩放的起始和结束比例。例如,从 1.0 缩放到 1.5,让视图放大 50%。
  • 旋转动画: 另一个 CABasicAnimationkeyPath 设置为 "transform.rotation.z"fromValuetoValue 可以是弧度值,比如从 0 旋转到 M_PI(180度)。
  • 移动动画: 使用 CABasicAnimationkeyPath 设置为 "position"fromValuetoValue 则是 CGPoint 类型,定义视图的起始和结束位置。
swift
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
scaleAnimation.fromValue = 1.0
scaleAnimation.toValue = 1.5

let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotationAnimation.fromValue = 0
rotationAnimation.toValue = Double.pi

let positionAnimation = CABasicAnimation(keyPath: "position")
positionAnimation.fromValue = CGPoint(x: 100, y: 100)
positionAnimation.toValue = CGPoint(x: 200, y: 200)

组合动画到动画组 🚀

一旦你创建了所有独立的动画,下一步就是将它们添加到 CAAnimationGroup 实例的 animations 数组中。

swift
let group = CAAnimationGroup()
group.animations = [scaleAnimation, rotationAnimation, positionAnimation]
group.duration = 2.0 // 动画总时长
group.fillMode = .forwards
group.isRemovedOnCompletion = false

设置 duration 属性来统一控制整个动画组的持续时间。这意味着所有包含在组内的动画都将在 2.0 秒内完成。fillModeisRemovedOnCompletion 属性确保动画结束后视图保持在最终状态,这对于观察动画效果至关重要。

将动画组应用到图层 🎯

最后一步是将配置好的 CAAnimationGroup 添加到你想要动画的视图的 layer 上。

swift
yourView.layer.add(group, forKey: "simultaneousAnimations")

通过 add(_:forKey:) 方法,动画组会立即开始执行。你可以为 forKey 参数提供一个唯一的标识符,以便将来需要时可以移除或引用这个动画。这种方法极大地简化了复杂动画的实现,让你能够轻松地创建出令人惊叹的用户体验。

动画组的优势与最佳实践 💡

使用 CAAnimationGroup 的最大优势在于其强大的同步能力和代码的整洁性。你不再需要手动协调每个动画的开始和结束时间,动画组会为你处理这一切。

  • 统一管理: 所有动画的持续时间、重复次数等属性都可以通过动画组统一设置。
  • 代码清晰: 将相关动画封装在一起,使代码更易读、更易维护。
  • 性能优化: Core Animation 会对动画组进行优化,确保流畅的性能表现。

通过这种方式,你可以轻松实现各种复杂的同步动画效果,例如一个按钮在被点击时同时进行颜色渐变、大小变化和轻微的抖动。这无疑会大大提升你的应用的用户体验!

本站使用 VitePress 制作