RORK LABEN
MAX — Rork MaxはReact NativeではなくネイティブSwiftアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR、Metalによる3D、ウィジェット、Dynamic Island、Live Activities、HealthKit、NFC、Core MLまで踏み込めますPUBLISH — App Storeへの公開を2クリックで実行でき、個人開発の申請作業を大きく短縮できますSWIFT — 自然文で指示するだけで動くコードが生成され、iOS・Android・Webのアプリを素早く形にできますGROWTH — Rorkは直近で1,500万ドルを調達。月間743,000訪問・成長率85%と伸びていますPRICING — 無料で開始でき、有料プランは月25ドルから。Rork Maxは月200ドルですMAX — Rork MaxはReact NativeではなくネイティブSwiftアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR、Metalによる3D、ウィジェット、Dynamic Island、Live Activities、HealthKit、NFC、Core MLまで踏み込めますPUBLISH — App Storeへの公開を2クリックで実行でき、個人開発の申請作業を大きく短縮できますSWIFT — 自然文で指示するだけで動くコードが生成され、iOS・Android・Webのアプリを素早く形にできますGROWTH — Rorkは直近で1,500万ドルを調達。月間743,000訪問・成長率85%と伸びていますPRICING — 無料で開始でき、有料プランは月25ドルから。Rork Maxは月200ドルです
記事一覧/開発ツール
開発ツール/2026-07-12中級

Rork Maxのアプリで、アイコンを気持ちよく動かすsymbolEffect実装メモ

Rork Maxが生成したSwiftアプリで、SF Symbolsをbounce・pulse・variableColor・contentTransitionで動かす実装を、動くコードとOSバージョンの出し分け、そして動かしすぎて後悔した落とし穴つきで整理します。

Rork Max222SF SymbolsSwiftUI63symbolEffectアニメーション10

プレミアム記事

個人開発で運営している癒し系アプリで、お気に入りのハートを押したときの反応がずっと物足りませんでした。タップすると色が変わるだけ。動きがないぶん、押した実感が薄いのです。指は反応を期待しているのに、画面は静かなまま。この小さなズレが、体験全体の温度を少しだけ下げていました。

Rork Max が出力するのは本物の Swift なので、この手のUIの手触りは iOS 標準の仕組みに素直に乗せられます。SF Symbols を使っているアイコンなら、symbolEffect を数行足すだけで、押した瞬間に跳ねたり、読み込み中に脈打ったりするようになります。ライブラリの追加もアセットの差し替えも要りません。

お気に入りボタンとダウンロード中インジケータという二つの題材で、symbolEffect の使いどころを手を動かしながら並べていきます。私自身が動かしすぎて逆に見づらくなった失敗も、正直に書きます。

まず一番小さい一歩:ワンショットのbounce

最初に試したのは、お気に入りボタンを押した瞬間だけ跳ねさせる動きでした。ここで大事なのは、常時アニメーションではなく「押した回数に反応させる」という考え方です。SwiftUI では、値が変わったときにエフェクトを一度だけ再生する value: 付きのオーバーロードを使います。

import SwiftUI
 
struct FavoriteButton: View {
    @State private var isFavorite = false
    // タップ回数を数え、bounceの再生トリガーにする
    @State private var tapCount = 0
 
    var body: some View {
        Button {
            isFavorite.toggle()
            tapCount += 1
        } label: {
            Image(systemName: isFavorite ? "heart.fill" : "heart")
                .font(.system(size: 32))
                .foregroundStyle(isFavorite ? .pink : .secondary)
                // tapCountが変わるたびに一度だけ跳ねる
                .symbolEffect(.bounce, value: tapCount)
        }
    }
}

value: に渡しているのが isFavorite(Bool)ではなく tapCount(Int)である点が要点です。Bool を渡すと、同じ状態へ戻したときにエフェクトが再生されないことがあります。カウンタを別に持たせておくと、「押すたびに必ず跳ねる」が確実になります。私は最初 Bool を直接渡してしまい、二回に一回しか跳ねない挙動に数十分悩みました。

体言止めで言えば、ワンショット系エフェクトの基本は「回数で駆動する」。この一点を押さえておくと、後の応用がぶれません。

常時動かす:読み込み中のpulseとvariableColor

次はダウンロード中のインジケータです。処理が続いている間ずっと動いてほしいので、こちらは繰り返し再生になります。.pulse は明滅、.variableColor はレイヤーごとに順番に光らせるエフェクトで、電波やダウンロードのような「段階的に進む」表現に向いています。

struct DownloadingIcon: View {
    let isDownloading: Bool
 
    var body: some View {
        Image(systemName: "arrow.down.circle")
            .font(.system(size: 28))
            .symbolEffect(
                .variableColor.iterative.reversing,
                isActive: isDownloading
            )
    }
}

繰り返し系では value: ではなく isActive: を使います。isActivetrue の間だけアニメーションが走り、false にすると自然に止まります。状態変数と直結できるので、ダウンロードの開始・完了に合わせて動きを切り替える処理がとても素直に書けます。

.iterative は一つずつ順に光らせる指定、.reversing は端まで行ったら折り返す指定です。この二つを外すと全レイヤーが同時に明滅し、せわしない印象になります。私は最初 .cumulative(積み上げ式)で作ってしまい、光が溜まっていく見た目がダウンロードの「減っていく」感覚と噛み合わず、作り直しました。エフェクトの選択は、見た目の好みではなく、伝えたい状態の方向と合わせるのが結局は近道でした。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
お気に入りボタンや読み込み中のアイコンを、数行のsymbolEffectで自然に動かせる状態にできる
iOS 17と18で使えるエフェクトの違いを1表で把握し、availabilityで安全に出し分けられる
variableColorで進捗を、contentTransitionで状態変化を表現する、実務で使い分けるための判断軸が手に入る
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-09
Rork Max が書いた Swift を、Swift 6 の厳格な並行性検査に通す
Rork Max が生成した SwiftUI アプリを Swift 6 の complete concurrency checking に通した記録です。警告217件をターゲット単位で削り、@MainActor の置き場所と Sendable の壊し方を実測とともに整理しました。
開発ツール2026-07-06
Rork Max の SwiftUI を @Observable へ移す — ObservableObject で広がっていた再描画を絞り込む
Rork Max が生成する SwiftUI アプリは ObservableObject と @Published をよく使いますが、状態が一つ変わるだけで購読しているビュー全体が再評価されます。Observation フレームワークの @Observable へ移すことで、プロパティ単位に再描画を絞り込む手順と、Instruments で実測したビュー実行回数の変化を、個人開発の作業ログとしてまとめました。
開発ツール2026-06-30
Rork Max で StandBy モードに最適化したウィジェットを実装する
充電中の横向き表示で使われる StandBy モード向けに、WidgetKit ウィジェットを最適化する実装手順です。常時表示の調光・ナイトモード・コンテナ背景の扱いを、Rork Max が生成したコードへどう手で加えるかまで含めて解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →