| name | ios-animation-code-review |
| description | Reviews iOS animation code for correctness, performance, accessibility, and Apple API best practices. Use when reviewing .swift files containing animation code — withAnimation, .animation(), PhaseAnimator, KeyframeAnimator, matchedGeometryEffect, navigationTransition, CABasicAnimation, CASpringAnimation, UIViewPropertyAnimator, UIDynamicAnimator, symbolEffect, scrollTransition, contentTransition, or custom Transition conformances. |
iOS Animation Code Review
Quick Reference
Hard gates (sequence)
Complete in order for the files in scope. If a step fails, omit the finding, re-anchor, or downgrade to a question—do not ship accusations without meeting the pass condition.
| Step | What you do | Pass condition (objective) |
|---|
| 1. Inventory | List each file under review and where animation APIs appear (line ranges or symbol names: withAnimation, .animation, matchedGeometryEffect, PhaseAnimator, UIKit/CA animators, etc.). | A written list exists; files with no animation APIs are explicitly marked out of scope. |
| 2. Anchor | Re-read the cited region in the current file or diff hunk before naming an issue. | Each [FILE:LINE] still shows the behavior; stale line numbers are fixed or the finding is dropped. |
| 3. Evidence | For framework-specific claims (spring curves, Transition conformance, Reduce Motion), cross-check the matching row in Quick Reference against references/*.md. | The finding’s detail names the reference file used, or states inline-only (structural/readability with no framework rule). |
| 4. Report | Emit findings using Output Format. | Headers match [FILE:LINE] ISSUE_TITLE; checklist items below are applied only where gates 1–2 covered that code. |
Output Format
Report each finding as:
[FILE:LINE] ISSUE_TITLE
Example: [AnimatedCard.swift:42] Missing Reduce Motion fallback for spring animation
All details, code suggestions, and rationale follow after the header line.
Review Checklist
When to Load References
- Incorrect spring setup or
withAnimation scope issues → swiftui-animation-patterns.md
- Hitches, dropped frames, or expensive animations in scroll views → performance.md
- Missing Reduce Motion handling or motion accessibility → accessibility.md
matchedGeometryEffect glitches or custom Transition bugs → transitions.md
Review Questions
- Does every animation have a Reduce Motion fallback that preserves the information conveyed? Is animation the only feedback channel, or are haptics/audio supplementing it?
- Is this custom animation necessary, or does the system already provide it (standard transitions, SF Symbol effects, Liquid Glass)?
- Could this animation cause frame drops — is it animating expensive properties (blur, shadow without path, mask) in a list or scroll view?
- Are all animations interruptible? Can the user act without waiting for completion? Does gesture-driven feedback follow spatial expectations?
- Is
withAnimation scoped to the minimal state change needed, or is it wrapping unrelated mutations?
- For
matchedGeometryEffect — are source and destination using the same ID and namespace, and is only one visible at a time?