关于 ios-animation-code-review
ios-animation-code-review 是用于审查 iOS 动画代码的技能,按步骤检查动画行为、性能、无障碍和转场,并要求问题报告有代码依据。
主要功能
- 01盘点范围内的动画 API
- 02检查动画与弹簧用法
- 03审查性能和渲染风险
- 04检查减少动态效果与 VoiceOver
- 05验证转场和几何效果
- 06将问题定位到代码行
适用场景
- 01审查 SwiftUI 动画变更
- 02检查动态效果无障碍支持
- 03排查动画掉帧
- 04验证 matchedGeometryEffect 转场
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill ios-animation-code-review安装后在 Claude Code 中输入/ios-animation-code-review确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/accessibility.mdperformance.mdswiftui-animation-patterns.mdtransitions.md详细介绍
iOS 动画代码审查
快速参考
| 问题类型 | 参考资料 |
|---|---|
| 弹簧参数、误用 withAnimation、阶段/关键帧错误 | references/swiftui-animation-patterns.md |
| 掉帧、离屏渲染、阻塞主线程 | references/performance.md |
| 减少动态效果、VoiceOver、动态效果敏感 | references/accessibility.md |
| Transition 协议、matchedGeometryEffect、导航转场 | references/transitions.md |
硬性门槛(按顺序执行)
按顺序完成审查范围内文件的以下步骤。如果某一步未通过,请省略该问题、重新锚定,或降级为疑问——未满足通过条件时,不要直接提出指控。
| 步骤 | 操作 | 通过条件(客观) |
|---|---|---|
| 1. 清点 | 列出每个待审查文件,以及动画 API 出现的位置(行号范围或符号名称:withAnimation、.animation、matchedGeometryEffect、PhaseAnimator、UIKit/CA 动画器等)。 | 已有书面清单;明确标注不含动画 API 的文件不在审查范围内。 |
| 2. 锚定 | 提出问题前,重新阅读当前文件或差异代码块中的引用区域。 | 每个 [FILE:LINE] 仍能体现相关行为;修正过时的行号,或删除该问题。 |
| 3. 佐证 | 对于特定框架相关的说法(弹簧曲线、Transition 一致性、减少动态效果),请根据 references/*.md,核对快速参考中的对应条目。 | 问题详情注明所用的参考文件,或声明 仅依据代码本身(没有框架规则的结构或可读性问题)。 |
| 4. 报告 | 使用输出格式列出问题。 | 标题符合 [FILE:LINE] ISSUE_TITLE 格式;仅对通过第 1 至 2 步门槛检查的代码应用下方核对项。 |
输出格式
按以下格式报告每个问题:
[FILE:LINE] ISSUE_TITLE
示例:[AnimatedCard.swift:42] 弹簧动画缺少减少动态效果的回退方案
所有详情、代码建议和理由都应写在标题行之后。
审查核对清单
- 已检查
@Environment(\.accessibilityReduceMotion)——动画提供减少动态效果的回退方案 - 动画不是唯一的反馈渠道——重要状态变化会搭配触觉反馈(
.sensoryFeedback)或音频 - 自定义动画没有重复系统提供的动态效果(标准导航转场、工作表展示、SF Symbol 效果)
- 高频交互中的动画简短且不显突兀,或不使用动画(由系统处理)
- 所有动画都可中断——用户无需等待动画结束即可交互
- 弹簧动画使用
duration/bounce参数(除 UIKit/CA 外,不使用原始的 mass/stiffness/damping 参数) - 没有使用不带
value:参数的已弃用.animation() -
withAnimation包裹的是状态变化,而非视图声明 -
matchedGeometryEffect的 ID 在命名空间内稳定且唯一 - 父视图几何形状随子视图显示而变化时,使用了
geometryGroup() - 循环动画(
PhaseAnimator、symbolEffect)具有有限阶段或适当的触发条件 - UIView 支持的图层中没有使用
CATransaction.setAnimationDuration()(应改用 UIView.animate) - 交互式动画可处理中断(飞行动画期间再次触发不会破坏状态)
- 阴影动画显式提供
shadowPath(避免逐帧重新计算) - 手势驱动的动画在释放时保留速度,以自然完成动画
- 手势驱动的反馈符合空间预期(关闭方向与显示方向一致)
- 没有为
.id()修饰符设置动画(这会破坏视图身份——应改用transition或matchedGeometryEffect)
何时加载参考资料
- Swift 设置不正确或
withAnimation作用域问题 → swiftui-animation-patterns.md - 滚动视图中出现卡顿、掉帧或动画开销过大 → performance.md
- 缺少减少动态效果的处理或动态效果无障碍支持 → accessibility.md
matchedGeometryEffect异常或自定义Transition错误 → transitions.md
审查问题
- 每个动画是否都有减少动态效果的备用方案,并保留动画所传达的信息?动画是否是唯一的反馈渠道,还是有触觉反馈或音频作为补充?
- 这个自定义动画是否确有必要,还是系统已提供相应效果(标准转场、SF Symbol 效果、Liquid Glass)?
- 这个动画是否可能导致掉帧——是否在列表或滚动视图中为开销较大的属性制作动画(模糊、未指定路径的阴影、蒙版)?
- 所有动画都能否中断?用户能否在动画完成前进行操作?由手势驱动的反馈是否符合空间预期?
withAnimation是否仅作用于所需的最小状态变更,还是连无关的变更也一并包裹?- 对于
matchedGeometryEffect,源视图和目标视图是否使用相同的 ID 和命名空间,且同一时刻是否只有一个视图可见?
评论
支持 Markdown