◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-07-12中級

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

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

Rork Max236SF SymbolsSwiftUI66symbolEffectアニメーション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: を使います。isActive が true の間だけアニメーションが走り、false にすると自然に止まります。状態変数と直結できるので、ダウンロードの開始・完了に合わせて動きを切り替える処理がとても素直に書けます。

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

✦

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-07-18
文字サイズ最大とドイツ語で、生成された画面は静かに詰まる — Rork Max の SwiftUI にレイアウト耐性の検証を通した記録
Rork Max が生成した SwiftUI 画面を疑似ローカライズと最大文字サイズに通し、どこから詰まるかを機械的に洗い出した記録です。ViewThatFits・ScaledMetric・layoutPriority の使いどころと、再生成のたびに回帰を捕まえるスナップショット検証を、実際の数値とともにまとめました。
⬡ 開発ツール2026-05-17
Rork Max の SwiftUI 機能を壁紙アプリ開発で検証した結果 — 実際に動いた機能と手を入れた機能
運用中の壁紙アプリの本番コードを基準に、Rork Max の SwiftUI ネイティブ生成を検証しました。そのまま使えた機能、手を入れた機能、生成を諦めた機能を、動くコードと実機での計測値とともにお伝えします。
⬡ 開発ツール2026-05-12
Rork Max で複数アプリ共通UIライブラリを Swift Package Manager で構築する実践ガイド
複数アプリを運営する個人開発者向けに、Swift Package Managerで共通UIライブラリを構築してRork Max生成コードの重複を排除する手順です。パッケージ構成の設計、テーマシステムとカードコンポーネント、アニメーションプリセットの共通化、テストまで詳解します。