本文へ移動

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 barsToolbars

部品 利用場面 構造 必要な状態・挙動 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. 一覧・設定行・選択

Apple公式: テキスト主体の情報は一覧に向く。階層を掘り下げる行には disclosure indicator、選択する行にはその結果を示す表示を使う。Lists and tables

行の種類 構造 意味 状態 SwiftUI mapping
基本の遷移行 必要ならleading glyph / 主ラベル / chevron 詳細へ移動 通常 / 押下 / 選択 NavigationLinkList 内に配置
副題つき遷移行 主ラベル + 副題、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 は近い選択肢をまとめる用途。ButtonsTogglesSegmented 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採用:

5. 検索・フォーム

Apple公式: 検索範囲を分かるようにし、可能なら入力中に結果を更新する。候補・履歴・フィルターは見つけやすさを補う。検索が主要な機能なら目立つ場所から利用できるようにする。Search fieldsSearching

部品 構造 必須状態 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. 案件一覧 → 詳細

  1. Tab「案件」に NavigationStack を置く。入口は Large Title「案件」、trailing に追加操作を置く。
  2. グループ化したリストに主ラベル・副題・状態を載せる。階層を進む行だけに chevron を付ける。
  3. 行を選ぶと詳細へ push。詳細は inline title、戻る操作、主要な情報、trailing に「編集」。
  4. 編集から帰ると同じ案件の内容を更新。戻ると元の検索条件・segment・位置を保つ。
  5. 行が消えた場合や取得できない場合は説明と戻る手段を表示する。空の詳細画面へ置き去りにしない。

受入: 一覧→詳細→戻る、詳細→別タブ→元タブ、保存後の値更新、消失したデータからの回復。

B. 検索と絞込み

  1. 一覧に検索を付け、対象を「案件名」と示す。検索欄の最終配置は標準 .searchable と OS に任せる。
  2. 「すべて / 進行中 / 完了」の一択segmentを結果と近い位置に置く。
  3. 文字と状態の条件を両方満たす結果を表示。未入力では通常一覧、0件では理由と「条件をクリア」。
  4. 読込中は状態を示し、通信失敗は再試行できる表示にする。空データと障害を同じ文言にしない。

受入: 検索→segment変更→0件→clear、読込→失敗→retry、条件を保持した詳細往復。

C. 設定

  1. Large Title「設定」と grouped Form。通知などの項目を意味ごとに section 分けする。
  2. 二値は switch、一択は picker、詳細設定は chevron 付き遷移行、読むだけの情報は値行。
  3. 「更新の通知」switch は即時反映し、section footer で意味を説明する。設定保存専用の大きい CTA を常設しない。
  4. OS の文字・外観・透明度設定への追従は製品側の既定動作とする。カタログ用の外観スイッチは製品設定と分ける。

受入: on/off の状態と読み上げ、失敗時の復帰、別タブ往復後の設定保持、設定行の種類が操作に合うこと。

D. 編集 sheet

  1. 詳細の「編集」から、選択中データのドラフトを sheet に読み込む。キャンセルは leading、保存する「完了」は trailing。
  2. 名前・状態・メモを Form に配置。入力後も分かるラベル、必要な補足を残す。
  3. blur 後の inline 検証と、エラー欄の再入力時の修正反映を用意する。保存時にも最終検証し、空欄・文字数等のエラーでは sheet を閉じず、値と修正方法を残す。
  4. 保存中は二重実行を防ぎ、成功時だけ一度確定して閉じる。失敗はドラフトを維持して再試行可能にする。
  5. 未変更のキャンセルはそのまま閉じる。変更後は破棄 / 編集継続を選び、選択に応じた戻り先へ移る。

受入: 編集→キャンセル、編集→破棄取消、エラー→修正→保存、保存失敗→再試行、閉じた後のフォーカスとデータ整合。

8. 共通状態と検証

各画面は content / loading / empty / error、各入力は idle / editing / invalid / disabled、書込みは draft / saving / saved / failed を明示して設計する。全画面に全ての状態を機械的に表示するのでなく、その画面で起こる状態を実装する。