# 画面設計書 59-WelcomeInitial画面

## 概要

本ドキュメントはWikipedia iOSアプリにおける「WelcomeInitial画面」（ウェルカム初期画面）の設計仕様を定義するものです。

### 本画面の処理概要

**業務上の目的・背景**：
本画面は、ウェルカムフローのための軽量コンテナViewControllerとして機能します。UIPageViewControllerをiPhone X以降のSafe Area制約に対応した形で埋め込むためのラッパーとして設計されています。Storyboard上でContainer Viewを使用してWMFWelcomePageViewControllerを埋め込み、Safe Area対応の制約を提供することで、UIPageViewController自体を変更することなくiPhone X対応を実現します。また、画面回転を縦向きに固定し、ステータスバーを非表示にするなど、オンボーディング体験に適した画面設定を提供します。

**画面へのアクセス方法**：
本画面はStoryboardから直接インスタンス化され、初回起動時のウェルカムフロー開始点として使用されます。

**主要な操作・処理内容**：
1. WMFWelcomePageViewControllerの埋め込み - Embed Segueで子ViewControllerを表示
2. 完了コールバックの伝播 - completionBlockを子ViewControllerに渡す
3. 画面回転制限 - 縦向きに固定
4. ステータスバー非表示 - オンボーディング中はステータスバーを隠す

**画面遷移**：
- 遷移元：WMFAppViewController（初回起動時）
- 遷移先：WMFWelcomePageViewController（Embed Segue）

**権限による表示制御**：
初回起動時のみ表示されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 63 | 初回起動ウェルカム | 補助機能 | 言語選択など初期設定 |

## 画面種別

オンボーディング（コンテナ）

## URL/ルーティング

本画面はStoryboardから表示されるため、URLルーティングは使用しません。
- Storyboard: Welcome.storyboard
- ViewController: WMFWelcomeInitialViewController

## 入出力項目

| 項目名 | 項目ID | 入出力 | データ型 | 必須 | 最大長 | バリデーション | 備考 |
|--------|--------|--------|----------|------|--------|----------------|------|
| 完了コールバック | completionBlock | 入力（内部） | (() -> Void)? | 任意 | - | - | フロー完了時の処理 |

## 表示項目

| 項目名 | 表示内容 | データソース |
|--------|----------|--------------|
| コンテンツ | WMFWelcomePageViewController | Embed Segue経由 |
| 背景 | paperBackground色 | theme.colors.paperBackground |

## イベント仕様

### 1-Segue準備（prepare(for:sender:)）

**トリガー**: Embed Segue実行時

**処理フロー**:
1. 遷移先がWMFWelcomePageViewControllerであることを確認
2. 確認失敗時はassertionFailure
3. テーマを適用
4. completionBlockを設定

### 2-テーマ適用

**トリガー**: apply(theme:)

**処理フロー**:
1. 親クラスのapply(theme:)を呼び出し
2. 背景色をtheme.colors.paperBackgroundに設定
3. 子ViewControllerにテーマを伝播

## データベース更新仕様

本画面単体ではデータベース更新を行いません。

## メッセージ仕様

本画面にはメッセージ表示機能はありません。

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| Segue先がWMFWelcomePageViewControllerでない | assertionFailure（開発時のみ） |

## 備考

- ThemeableViewControllerを継承
- iPhone X Safe Area対応のためのコンテナとして設計
- prefersStatusBarHidden = true でステータスバー非表示
- supportedInterfaceOrientations = .portrait で縦向き固定
- preferredInterfaceOrientationForPresentation = .portrait
- shouldAutorotate = false で回転を無効化
- 子ViewControllerへのテーマ伝播を実装
- コード内コメントによると「UIPageViewControllerを変更せずにiPhone X対応を実現するための軽量アプローチ」

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: 設計意図を理解する

ファイル冒頭のコメントで設計意図を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WMFWelcomeInitialViewController.swift | `Wikipedia/Code/WMFWelcomeInitialViewController.swift` | 冒頭コメント（1-4行目） |

**読解のコツ**: このViewControllerは「UIPageViewControllerを変更せずにiPhone X Safe Area対応を実現する」という明確な目的を持っています。

#### Step 2: Segue準備を理解する

子ViewControllerへのデータ受け渡しを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | WMFWelcomeInitialViewController.swift | `Wikipedia/Code/WMFWelcomeInitialViewController.swift` | prepare(for:sender:)（7-14行目） |

**主要処理フロー**:
- **8-10行目**: WMFWelcomePageViewControllerの型チェック
- **12行目**: テーマ適用
- **13行目**: completionBlock設定

#### Step 3: 画面設定を理解する

ステータスバーと画面回転の設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | WMFWelcomeInitialViewController.swift | `Wikipedia/Code/WMFWelcomeInitialViewController.swift` | 画面設定プロパティ（30-44行目） |

**主要処理フロー**:
- **30-32行目**: prefersStatusBarHidden = true
- **34-36行目**: supportedInterfaceOrientations = .portrait
- **38-40行目**: preferredInterfaceOrientationForPresentation = .portrait
- **42-44行目**: shouldAutorotate = false

### プログラム呼び出し階層図

```
WMFWelcomeInitialViewController
    │
    ├─ completionBlock プロパティ [6行目]
    │
    ├─ prepare(for:sender:) [7行目]
    │      ├─ guard WMFWelcomePageViewController確認
    │      ├─ vc.apply(theme:)
    │      └─ vc.completionBlock = completionBlock
    │
    ├─ apply(theme:) [16行目]
    │      ├─ super.apply(theme:)
    │      ├─ view.backgroundColor設定
    │      └─ 子VCへテーマ伝播
    │
    ├─ prefersStatusBarHidden [30行目]
    │      └─ return true
    │
    ├─ supportedInterfaceOrientations [34行目]
    │      └─ return .portrait
    │
    ├─ preferredInterfaceOrientationForPresentation [38行目]
    │      └─ return .portrait
    │
    └─ shouldAutorotate [42行目]
           └─ return false
```

### データフロー図

```
[入力]                      [処理]                           [出力]

completionBlock ────▶ WMFWelcomeInitialViewController
                              │
                              ├─▶ prepare(for:sender:)
                              │         │
                              │         └─▶ WMFWelcomePageViewController
                              │                   ├─ theme設定
                              │                   └─ completionBlock設定
                              │
                              └─▶ [ウェルカムフロー完了]
                                        │
                                        └─▶ completionBlock()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WMFWelcomeInitialViewController.swift | `Wikipedia/Code/WMFWelcomeInitialViewController.swift` | ソース | メインViewController |
| WMFWelcomePageViewController.swift | `Wikipedia/Code/WMFWelcomePageViewController.swift` | ソース | 子ViewController |
| ThemeableViewController.swift | `Wikipedia/Code/ThemeableViewController.swift` | ソース | 親クラス |
| Welcome.storyboard | `Wikipedia/Storyboards/` | Storyboard | UI定義（Embed Segue含む） |
