ios-animation-code-review について
ios-animation-code-reviewは、iOSプロジェクトのアニメーションコードをレビューするスキルです。アニメーションの動作、パフォーマンス、アクセシビリティ、トランジションを順に確認し、根拠のある指摘を促します。
主な機能
- 01対象範囲のアニメーションAPIを確認
- 02アニメーションとスプリングの使い方を確認
- 03パフォーマンスと描画負荷を確認
- 04視差効果を減らす設定とVoiceOverを確認
- 05トランジションとジオメトリエフェクトを検証
- 06指摘をコード位置に結び付ける
活用シーン
- 01SwiftUIアニメーション変更のレビュー
- 02動きのアクセシビリティ確認
- 03アニメーションのフレーム落ち調査
- 04matchedGeometryEffectのトランジション検証
インストール
コマンドをコピーしてターミナルで実行します。
$
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 アニメーションのコードレビュー
クイックリファレンス
| 問題の種類 | 参照先 |
|---|---|
Spring のパラメーター、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. エビデンス | フレームワーク固有の主張(spring カーブ、Transition への準拠、視差効果を減らす設定)については、クイックリファレンス の該当行を references/*.md と照合します。 | 指摘の詳細に使用した参照ファイルを明記するか、インラインのみ(フレームワークのルールを伴わない構造/可読性の問題)と記載します。 |
| 4. 報告 | 出力形式 に従って指摘を出力します。 | 見出しが [FILE:LINE] ISSUE_TITLE と一致し、以下のチェックリスト項目はゲート1〜2で確認したコードにのみ適用されます。 |
出力形式
各指摘を次のように報告します。
[FILE:LINE] ISSUE_TITLE
例:[AnimatedCard.swift:42] Spring アニメーションに視差効果を減らす設定時の代替処理がありません
詳細、コードの提案、根拠はすべてヘッダー行の後に続けます。
レビューチェックリスト
-
@Environment(\.accessibilityReduceMotion)を確認している — アニメーションには視差効果を減らす設定時の代替処理がある - アニメーションだけをフィードバック手段としていない — 重要な状態変化には触覚フィードバック(
.sensoryFeedback)または音声を組み合わせている - カスタムアニメーションが、システム標準の動き(標準のナビゲーショントランジション、シートの表示、SF Symbol のエフェクト)と重複していない
- 頻繁な操作に対するアニメーションは短く控えめである — または、システムが処理するためアニメーションを使っていない
- すべてのアニメーションを中断できる — 操作を続ける前に完了を待つことをユーザーに強制しない
- Spring アニメーションでは
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
- Reduce Motion への対応が不足している場合、またはモーションのアクセシビリティに問題がある場合 → accessibility.md
matchedGeometryEffectの不具合、またはカスタムTransitionのバグが発生する場合 → transitions.md
レビューの確認事項
- すべてのアニメーションに、伝える情報を維持する Reduce Motion 用の代替手段がありますか? フィードバック手段がアニメーションだけになっていませんか? ハプティクスや音声で補っていますか?
- このカスタムアニメーションは本当に必要ですか? システムがすでに同じ機能(標準のトランジション、SF Symbol のエフェクト、Liquid Glass)を提供していませんか?
- このアニメーションによってフレーム落ちが発生する可能性はありませんか? リストやスクロールビューで、負荷の高いプロパティ(ぼかし、パスを指定しないシャドウ、マスク)をアニメーションさせていませんか?
- すべてのアニメーションを中断できますか? 完了を待たずにユーザーが操作できますか? ジェスチャーによるフィードバックは、空間的な期待に沿っていますか?
withAnimationは必要最小限の状態変更に適用されていますか? 関係のない変更までまとめて囲んでいませんか?matchedGeometryEffectについて、ソースとデスティネーションで同じ ID と名前空間を使用し、同時に表示されるのは片方だけですか?
コメント
Markdown 対応