Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Building Custom Toggle in SwiftUI with Stunning Animations

2025年09月14日に「Medium」が公開したITニュース「Building Custom Toggle in SwiftUI with Stunning Animations」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

SwiftUIで、標準のトグルをスライドやフェード、バウンスアニメーション付きのエレガントなカスタムコンポーネントにする方法を、ステップバイステップで解説するチュートリアル記事だ。

ITニュース解説

この解説文は、Appleが提供するモダンなUIフレームワークであるSwiftUIを使って、単なるON/OFF切り替えスイッチ以上の魅力的なカスタムトグルを構築する方法を、システムエンジニアを目指す初心者の視点から丁寧に説明する。

まず、SwiftUIとは何かから始めよう。SwiftUIは、iPhoneやiPad、Mac、Apple Watch、Apple TVなど、Apple製品向けのアプリケーションのユーザーインターフェース(UI)を簡単に、かつ効率的に作成するためのフレームワークだ。従来のUI構築方法とは異なり、「宣言的UI」というアプローチを採用しているのが特徴である。これは、「このように画面を表示したい」とコードで宣言するだけで、フレームワークが自動的にその見た目を構築してくれるという考え方だ。例えば、「このボタンはテキストが中央にあり、背景は青色で、タップされたらこの処理を実行する」と書けば、その通りのボタンが自動的に作られる。これにより、開発者はUIの見た目と動作を直感的に記述でき、複雑なUIも比較的容易に構築できるようになる。

しかし、SwiftUIが提供する標準のUIコンポーネントだけでは、アプリのブランドイメージに合わせた独特なデザインや、ユーザーを惹きつけるようなインタラクションをすべて表現できるわけではない。そこで重要になるのが、「カスタムUI」の作成だ。カスタムUIとは、標準で用意されている部品ではなく、開発者自身がデザインやアニメーションを一から定義して作るUIのことである。今回扱う「カスタムトグル」も、その一つだ。

トグルとは、ON/OFFの状態を切り替えるスイッチのようなUIコンポーネントを指す。例えば、設定画面で「通知をオンにするかオフにするか」や、「Wi-Fiを有効にするか無効にするか」といった場面でよく使われる。ユーザーはトグルをタップすることで、その設定の状態を簡単に変更できる。標準のトグルは機能的には十分だが、見た目は画一的で、アプリ全体の世界観に合わない場合もある。そこでカスタムトグルの出番となる。カスタムトグルを作成する目的は、アプリの個性的なデザインに統一感を出すこと、そしてユーザーにとってより楽しく、直感的な操作体験を提供することにある。単なる機能だけでなく、使うこと自体が楽しくなるようなUIを目指すわけだ。

SwiftUIでカスタムトグルを実装する上で鍵となるのが、「ToggleStyle」プロトコルだ。SwiftUIでは、標準のトグルの見た目や動作を完全にカスタマイズするために、このプロトコルに準拠した独自のスタイルを定義できる。これにより、標準トグルのON/OFF切り替えという基本的な機能はそのままに、見た目だけを自由に変更できるのだ。カスタムスタイルを定義する際は、makeBodyというメソッドの中で、トグルの見た目を構築するViewの階層を記述する。このmakeBodyメソッドには、現在のトグルの状態(ONかOFFか)や、トグルを切り替えるためのアクションといった情報がConfigurationという形で渡される。これを利用して、ONの状態ならこの見た目、OFFの状態ならあの見た目、というように条件分岐させながらUIを構築できる。

そして、カスタムトグルをより魅力的にする要素が「アニメーション」だ。アニメーションは、単に見た目を華やかにするだけでなく、ユーザー体験を劇的に向上させる重要な役割を担う。例えば、トグルがONからOFFに切り替わる際に、ただ見た目がポンと変わるよりも、滑らかに動いたり、色が変化したりする方が、ユーザーは何が起こったのかを瞬時に理解できる。アニメーションは、アプリに生命感を与え、ユーザーの操作に対する明確なフィードバックとなり、アプリをよりプロフェッショナルで洗練されたものに見せる効果がある。

記事で紹介されているアニメーションの種類は主に三つある。 一つ目は「スライド」アニメーションだ。これは、要素が左右や上下に滑らかに移動する動きを指す。カスタムトグルでは、例えばトグルの内部にある丸いスイッチ部分が、ONの状態では右端へ、OFFの状態では左端へとスムーズに横滑りすることで、ON/OFFの状態変化を視覚的に分かりやすく表現できる。 二つ目は「フェード」アニメーションだ。これは、要素が徐々に現れたり、あるいは徐々に消えたりする動きである。トグルのON/OFFの状態に応じて表示されるテキスト(例: "ON"や"OFF")やアイコンが、ゆっくりと透明度を増減させながら現れたり消えたりすることで、より洗練された印象を与える。突然表示が変わるよりも、優雅な変化を伴うことで、ユーザーはストレスなく情報を受け取れる。 三つ目は「バウンス」アニメーションだ。これは、要素がまるでゴムボールのようにポンと跳ねるような動きである。トグルがON/OFFに切り替わった直後、スイッチ部分が少しだけ跳ねるようなアニメーションを加えることで、操作に楽しさや強調を与え、ユーザーに「操作が成功した」という明確な感覚を提供できる。

SwiftUIでアニメーションを実装する最も基本的な方法は、withAnimation { ... }というブロックを使うことだ。このブロック内で、UIの状態を管理するState変数を変更すると、そのStateの変化によって影響を受けるUI要素が、指定された時間や動きのカーブ(例えば、滑らかな動きや跳ねる動きなど)に従って自動的にアニメーションする。また、animation(_:value:)というモディファイアを使うことで、特定のViewに対して、特定のStateの値が変化したときにアニメーションを適用するといった、よりきめ細やかな制御も可能だ。これにより、例えばトグルの背景色が変わるアニメーションと、内部のスイッチがスライドするアニメーションをそれぞれ異なる設定で同時に実行できる。

カスタムトグルの作成手順は、概念的には以下のような流れとなる。 まず、ToggleStyleプロトコルに準拠した新しい構造体を作成する。この構造体の中に、トグルのON/OFF状態に応じてどのように表示を変えるか、といったデザインのロジックを記述する。具体的には、makeBodyメソッド内で、ZStackHStackなどのViewコンテナを組み合わせて、トグルの土台となる長方形や、ON/OFFを表す丸いスイッチ部分、そして必要であれば"ON"や"OFF"といったテキストラベルなどを配置する。 次に、Configurationから渡されるisOnプロパティを使って、現在のトグルの状態(ONかOFFか)を判定し、それに応じて背景色を変えたり、スイッチの位置を左右に移動させたりする。 ユーザーがトグルをタップした際の動作も重要だ。これもConfigurationから提供されるtrigger()メソッドを呼び出すことで、トグルの状態を切り替えられる。この状態変更をwithAnimationブロックで囲むことで、タップされた際に滑らかなアニメーションを伴ってトグルが切り替わるようにする。 さらに、スライド、フェード、バウンスといった具体的なアニメーションを実装するには、位置(offsetモディファイア)、透明度(opacityモディファイア)、拡大縮小(scaleEffectモディファイア)などをStateの変化に応じて変化させ、それらの変化にanimationモディファイアを適用していく。例えば、スイッチ部分のoffsetをONとOFFで異なる値に設定し、animation(.spring(), value: configuration.isOn)のように記述することで、ON/OFFの切り替え時にバネのような弾むスライドアニメーションを実現できる。

このようにして作成したカスタムトグルスタイルは、一度作ればアプリ内の任意のToggleに適用できるため、再利用性が高い。また、色やアニメーションの速度、バウンスの度合いなどをパラメータとして構造体に持たせることで、一つのカスタムスタイルをベースに、様々なバリエーションのトグルを簡単に生成できるようになる。

システムエンジニアを目指す初心者にとって、SwiftUIでのカスタムトグル作成は、宣言的UIの基本的な考え方、状態管理(StateBinding)、そして魅力的でインタラクティブなユーザー体験を生み出すアニメーションの適用方法を学ぶ上で、非常に実践的で面白い課題だ。これらの知識とスキルは、将来的に複雑なアプリケーションを開発する上で不可欠なものとなるだろう。標準コンポーネントの枠を超えて、自分だけのデザインと動きを持つUIを作り出す経験は、技術者としての成長に大きく貢献するはずだ。

関連コンテンツ

【ITニュース解説】Building Custom Toggle in SwiftUI with Stunning Animations | いっしー@Webエンジニア