iOS 部品と画面レシピ
確認日: 2026-09-05。対象: mobile-app の iOS / iPadOS。基盤は mobile-ios-foundations.md、直接操作は mobile-ios-motion.md、入口・Android対応は mobile-app.md。動かせるiOS見本 で部品と画面遷移を確認する。
この文書の部品の組合せ・配置・業務上の振舞いは FP採用規約。各節の「Apple公式」は参照した役割・慣習の要約。HTML の表示・操作は構造を説明する近似で、SwiftUI のネイティブ実装そのものではない。
1. 部品の選び方
| やりたいこと | 選ぶ部品 | 避ける代用 |
|---|---|---|
| アプリの大きい領域を切り替える | Tab bar | Segmented control、削除や保存を含むタブ |
| 一覧から詳細へ進む | Navigation link / push | 詳細をすべて sheet で開く |
| 同じ一覧を絞り込む | Search / segmented picker | 最上位タブを状態フィルターに使う |
| 現在の文脈で短く編集する | Sheet + Form | 画面全面を独自カードで覆う |
| 即時の on / off 設定 | Toggle | 「保存」しないと反映しない設定用 switch |
| 複数から一つ選ぶ | Picker / selection list | 二値用 toggle の連続配置 |
| 重大で取り消せない操作を確認する | Alert | 毎回の保存成功 alert |
| 行為に伴う複数の選択肢を出す | Confirmation dialog | 通常の一覧を小さい alert に押し込む |
| 終了までの進み具合を示す | ProgressView | 実際の処理と無関係な百分率 |
2. ナビゲーション・ツールバー
Apple公式: Tab bar は最上位の行先に使い、各行先のナビゲーション状態を保つ。アイコンに短いラベルを付ける。Toolbar は戻る・タイトル・操作を扱い、機能と頻度でまとまりを分ける。Tab bars、Toolbars
| 部品 | 利用場面 | 構造 | 必要な状態・挙動 | SwiftUI mapping |
|---|---|---|---|---|
| Tab bar | 概要 / 案件 / 設定 | glyph + 短い名詞、選択表示 | 選択 / 非選択。切替前の階層・検索条件を維持 | TabView(selection:) + 各タブの NavigationStack |
| Large title | 各タブの入口 | 主要タイトル、必要時に短い副題 | スクロールしても文脈が分かる | .navigationTitle(...)、標準 large title |
| 詳細 navigation | 一覧→詳細 | leading に戻る、現在のタイトル | pop で元の一覧・位置へ戻る | NavigationLink + .navigationDestination(...) |
| Toolbar action | 新規 / 編集 / 完了 / その他 | navigation と action を区別、重要操作は trailing | 通常 / 押下 / 無効。対象が変わると操作も更新 | .toolbar + ToolbarItem / ToolbarItemGroup |
FP採用:
- 標準は 3 タブ「概要 / 案件 / 設定」。案件ごとに 3〜5 の主要な行先へ整理する。タブに「新規作成」「削除」を入れない。
- iOS 見本では全タブを同じ navigation shell に置き、選択中だけを tint と形で示す。glyph とラベルを両方残す。
- 一覧入口は Large Title、詳細は標準 inline title を使い分ける。画面内に同じ大きなタイトルを重複させない。
- trailing の主操作は一つを基本とし、低頻度の処理は More メニューなどへ整理する。戻る操作を独自アイコンの意味に変更しない。
- HTML でバー高や丸角を近似しても、その値を iOS の固定寸法として転記しない。
3. 一覧・設定行・選択
Apple公式: テキスト主体の情報は一覧に向く。階層を掘り下げる行には disclosure indicator、選択する行にはその結果を示す表示を使う。Lists and tables
| 行の種類 | 構造 | 意味 | 状態 | SwiftUI mapping |
|---|---|---|---|---|
| 基本の遷移行 | 必要ならleading glyph / 主ラベル / chevron | 詳細へ移動 | 通常 / 押下 / 選択 | NavigationLink を List 内に配置 |
| 副題つき遷移行 | 主ラベル + 副題、trailingに短い値 + chevron | 一覧で概要を読んで詳細へ | 読込済 / 未読 / 選択 | NavigationLink + VStack(alignment: .leading) |
| 値の表示行 | ラベル / 値 | 読むだけ | データあり / 未設定 | LabeledContent 等 |
| 設定の二値行 | ラベル + 必要な説明 / switch | on / off | on / off / 無効 | Toggle |
| 一択選択行 | ラベル / 現在値 | 設定候補から選ぶ | 未選択 / 選択済 / 無効 | Picker または選択リスト |
| 破壊的な操作行 | 操作名、必要な影響説明 | 削除など | 通常 / 確認中 / 実行中 / 失敗 | Button(role: .destructive) |
FP採用: 同じ意味の行は一つの grouped surface にまとめる。section header はグループ名、footer は選択の影響を説明する。すべての行を独立した影付きカードにしない。値だけの行や switch 行に chevron を付けない。親行の tap と子の switch が競合する入れ子ボタンを作らない。副題が長ければ行を伸ばし、文字を切って高さを維持しない。
狭い幅・大きい文字で label が accessory に圧迫される場合は、label を上段、value / accessory を下段にする。詳細 toolbar の題名も必要なら折り返し、固定一行のために主ラベルを縮小・省略しない。
4. ボタン・トグル・セグメント
Apple公式: 標準ボタンは操作状態と外観への適応を備える。重要度はサイズの差よりスタイルで分け、独自ボタンにも押下状態を持たせる。Toggle は二つの反対の状態、segmented control は近い選択肢をまとめる用途。Buttons、Toggles、Segmented controls
| 部品 | 構造と使い分け | 状態 | SwiftUI mapping |
|---|---|---|---|
| Prominent button | 保存・作成など、その文脈の主操作。背景に tint | 通常 / 押下 / 無効 / 実行中 | Button + .buttonStyle(.borderedProminent) 等の標準スタイル |
| 補助ボタン | キャンセル・詳細を見る等。塗りの強調を弱める | 通常 / 押下 / 無効 | 標準 Button / contextual style |
| アイコンボタン | 文脈から分かる編集・追加・More。読み上げ名必須 | 通常 / 押下 / 無効 / 選択 | Button + Label、必要なら .labelStyle(.iconOnly) |
| Destructive button | 削除・破棄の影響が分かる動詞 | 確認待ち / 実行中 / 失敗 | Button(role: .destructive) |
| Switch | 意味のあるラベル + on/offの位置と形 | on / off / 無効、必要なら通信中 | Toggle(isOn:)。通常は標準switch |
| Segmented picker | 「すべて / 進行中 / 完了」など近い一択 | 選択 / 非選択 / 無効 | Picker(selection:) + .pickerStyle(.segmented) |
FP採用:
- 主操作は一つを基本とし、複数の選択肢は同程度の操作サイズで比較できるようにする。HTML ボタンの幅は親より大きくしない。
- 設定用 switch は即時反映する。通信に失敗したら表示を戻し、理由と再試行を伝える。編集 sheet 内の switch はドラフトへの変更であり、sheet の保存時に確定することを区別する。
- HTML見本のswitchは共通の
--fpm-switch-duration: 320ms/--fpm-switch-ease: cubic-bezier(.22,1,.36,1)でつまみ移動と背景色を同期する。終盤で減速し、連打時も現在表示位置から反転する。押下は即座の明度変化と小さなつまみの変形で伝え、値・aria-checkedはclick時に確定する。入力ロックや完了待ちを入れない。これらはFPのWeb近似値で、標準Toggleの固定値ではない。Reduce Motionでは移動・変形を省き、値と色のfeedbackを保つ。 - segment は 2〜3 個を基本とする。長いラベルや大きい文字で収まらない場合は Picker / メニュー等へ変える。文字だけ縮めない。全アプリの行先には用いない。
- HTMLのsegmentとtabはグループごとに1枚の
.fpm-selection-indicatorを持ち、選択buttonの実測位置・サイズへ320msで移動する。文字・glyph・フォーカスは動かさず、選択と結果は即時更新する。初回/再表示/resizeは静的配置、同じ選択は再描画せず押下反応だけ。詳細な適用範囲は短い操作の規約を参照。 - 無効状態の理由は必要な文脈で読めるようにする。見た目だけの disabled にせず、操作も防ぐ。処理中に同じ保存・削除を二重に開始しない。
- 押下時はすぐに feedback を見せ、保存・削除・値の変更は通常の activate で確定する。pointer-down を click の代わりにせず、drag-away / pointercancel と keyboard 操作を含めて確認する。動きと操作 §3
5. 検索・フォーム
Apple公式: 検索範囲を分かるようにし、可能なら入力中に結果を更新する。候補・履歴・フィルターは見つけやすさを補う。検索が主要な機能なら目立つ場所から利用できるようにする。Search fields、Searching
| 部品 | 構造 | 必須状態 | SwiftUI mapping |
|---|---|---|---|
| Search | 範囲が分かる入力欄、検索アイコン、消去 | 未入力 / 入力中 / 実行中 / 結果 / 0件 / 失敗 | .searchable(text:placement:prompt:)、必要なら .searchSuggestions |
| Text field | 残るラベル + 値、補足 | 空 / 入力中 / 有効 / エラー / 無効 | TextField、キーボード種別・入力属性 |
| Secure input | 残るラベル + 保護された値 | 同上 | SecureField |
| 長文 | ラベル + 複数行の入力 | 入力中 / エラー | TextEditor |
| Form section | 関連項目、header、footer | 項目単位の状態 + formの実行状態 | Form + Section |
FP採用: 一覧に属する検索の対象は「案件名」と明示する。非同期検索では古いリクエストが新しい結果を上書きしないように扱う。入力文字と選択segmentを組み合わせ、0件と通信失敗を別の画面状態で表す。「条件をクリア」で元に戻せるようにする。
placeholder は検索範囲の補助には使えるが、業務入力欄のラベルを置き換えない。編集時のエラーは該当欄の近くに理由を表示し、入力値を保持する。Apple HIG: Text fields
FP採用: 初回の文字入力中に毎文字エラーを告げず、blur 等で入力が区切られた時点で検証する。既にエラーがある欄は再入力で修正を反映する。IME composition 中は割り込まず、保存時の最終検証も残す。上流の inline validation は、このプロファイルに合わせて採用する。
6. シート・アラート・進捗
Apple公式: Sheet は現在の文脈に近い短い作業に向く。単一画面の iOS sheet は leading に Cancel、trailing に Done。複雑な作業は別の表示方法を検討し、メイン画面からシートを何枚も重ねない。Sheets
| 部品 | 構造 | 必須状態・終了条件 | SwiftUI mapping |
|---|---|---|---|
| 編集 sheet | 文脈を残す背景、題名、キャンセル / 完了(保存)、フォーム | 未変更 / 編集中 / エラー / 保存中 / 保存済 | .sheet + NavigationStack + Form + toolbar |
| 選択 sheet | 選択肢、現在値、終了操作 | 選択中 / 確定 / 取消 | .sheet、用途に応じ .presentationDetents |
| Alert | 状況が分かる題名、短い説明、明確な動詞 | 確認 / キャンセル / 必要時の再試行 | .alert |
| Confirmation dialog | 行為に付随する選択肢と取消 | 継続 / 破棄 / 取消等 | .confirmationDialog |
| 確定進捗 | 進み具合が分かるindicator、必要な説明 | 実行中 / 完了 / 停止 / 失敗 | ProgressView(value:total:) |
| 不確定進捗 | spinner、対象作業の説明 | 実行中 / 完了 / 失敗 | ProgressView |
FP採用: 編集 sheet は入力内容に合う高さを選び、必要に応じ medium / large を使う。キーボードや大きい文字で領域が足りなければ大きい表示へ広げる。detent の高さ・sheet の角丸は OS に任せる。HTML 見本は中・大の切替でこの関係を示す。下方向スワイプや Escape 等も含め、未保存のドラフトを黙って破棄しない。キャンセルの追加選択は confirmation dialog で扱う。保存成功は親画面を更新し、毎回 alert を出さない。
HTML 見本の grabber は medium / large の間を動かし、drag では閉じない。途中の掴み直し、速度による行先予測、soft bounds、キーボードの代替を 動きと操作 §5 に定める。未変更の close は途中で掴み直して取り消せる。保存・明示的な破棄はデータの確定を優先する。ネイティブ標準 sheet の gesture を独自 controller に置き換える規約ではない。
Apple公式: Alert は重大な情報や取り消せない操作に絞る。通常の取り消せる操作や、情報を知らせるだけの場面で乱用しない。破壊的な操作には取消の選択肢を提供する。Alerts
FP採用: この業務見本の案件削除では、対象名・削除される範囲・取り消せるかを説明し、「キャンセル / 削除」で選ぶ。HTML では dialog の名前・説明、内部フォーカス、背景の操作抑止、閉じた後のフォーカス復帰を実装する。これはブラウザでのアクセシビリティ実装であり、SwiftUI に同じ DOM 処理を求めるものではない。
Apple公式: 進捗が分かる処理には確定進捗、不明なら不確定進捗を使う。進捗の値は実際の状態に対応させ、処理が止まった場合も説明を加える。Progress indicators
7. 画面レシピ
以下はこのブランドの業務アプリを作るための FP採用レシピ。部品を並べるだけでなく、データ・操作・戻り先を一組として実装する。
A. 案件一覧 → 詳細
- Tab「案件」に
NavigationStackを置く。入口は Large Title「案件」、trailing に追加操作を置く。 - グループ化したリストに主ラベル・副題・状態を載せる。階層を進む行だけに chevron を付ける。
- 行を選ぶと詳細へ push。詳細は inline title、戻る操作、主要な情報、trailing に「編集」。
- 編集から帰ると同じ案件の内容を更新。戻ると元の検索条件・segment・位置を保つ。
- 行が消えた場合や取得できない場合は説明と戻る手段を表示する。空の詳細画面へ置き去りにしない。
受入: 一覧→詳細→戻る、詳細→別タブ→元タブ、保存後の値更新、消失したデータからの回復。
B. 検索と絞込み
- 一覧に検索を付け、対象を「案件名」と示す。検索欄の最終配置は標準
.searchableと OS に任せる。 - 「すべて / 進行中 / 完了」の一択segmentを結果と近い位置に置く。
- 文字と状態の条件を両方満たす結果を表示。未入力では通常一覧、0件では理由と「条件をクリア」。
- 読込中は状態を示し、通信失敗は再試行できる表示にする。空データと障害を同じ文言にしない。
受入: 検索→segment変更→0件→clear、読込→失敗→retry、条件を保持した詳細往復。
C. 設定
- Large Title「設定」と grouped
Form。通知などの項目を意味ごとに section 分けする。 - 二値は switch、一択は picker、詳細設定は chevron 付き遷移行、読むだけの情報は値行。
- 「更新の通知」switch は即時反映し、section footer で意味を説明する。設定保存専用の大きい CTA を常設しない。
- OS の文字・外観・透明度設定への追従は製品側の既定動作とする。カタログ用の外観スイッチは製品設定と分ける。
受入: on/off の状態と読み上げ、失敗時の復帰、別タブ往復後の設定保持、設定行の種類が操作に合うこと。
D. 編集 sheet
- 詳細の「編集」から、選択中データのドラフトを sheet に読み込む。キャンセルは leading、保存する「完了」は trailing。
- 名前・状態・メモを
Formに配置。入力後も分かるラベル、必要な補足を残す。 - blur 後の inline 検証と、エラー欄の再入力時の修正反映を用意する。保存時にも最終検証し、空欄・文字数等のエラーでは sheet を閉じず、値と修正方法を残す。
- 保存中は二重実行を防ぎ、成功時だけ一度確定して閉じる。失敗はドラフトを維持して再試行可能にする。
- 未変更のキャンセルはそのまま閉じる。変更後は破棄 / 編集継続を選び、選択に応じた戻り先へ移る。
受入: 編集→キャンセル、編集→破棄取消、エラー→修正→保存、保存失敗→再試行、閉じた後のフォーカスとデータ整合。
8. 共通状態と検証
各画面は content / loading / empty / error、各入力は idle / editing / invalid / disabled、書込みは draft / saving / saved / failed を明示して設計する。全画面に全ての状態を機械的に表示するのでなく、その画面で起こる状態を実装する。
- Dynamic Type の最大サイズで主な作業を終えられる。数値・ラベル・操作が重ならない。
- VoiceOver に名前・役割・値・選択・無効を伝え、読み順が視覚順と合う。意味のない装飾は読ませない。
- タブ、push/pop、sheet、alert の関係が分かり、閉じた後に元の文脈へ戻る。
- スワイプ・長押し以外にも同じ操作へ到達できる。
- light / dark / increased contrast / reduced transparency / reduced motion を確認する。
- HTML 見本は狭幅・200%文字・キーボード・フォーカス・ダイアログ復帰を確認する。ネイティブの実機適合確認の代わりにはしない。