# 画面設計書 56-WelcomePage画面

## 概要

本ドキュメントはWikipedia iOSアプリにおける「WelcomePage画面」（ウェルカムページビューコントローラ）の設計仕様を定義するものです。

### 本画面の処理概要

**業務上の目的・背景**：
本画面は、ウェルカムフロー（オンボーディング）における各ページの管理とナビゲーションを担当するUIPageViewControllerのサブクラスです。複数のウェルカムページ（Introduction、Exploration、Languages、Analytics）をページングで管理し、ユーザーがスワイプまたはボタンで各ページを移動できるようにします。ページインジケーター（ドット）、次へボタン、スキップボタンを提供し、ユーザーが自分のペースでオンボーディングを進められる体験を実現します。

**画面へのアクセス方法**：
本画面は直接アクセスするものではなく、WelcomeViewControllerまたはWMFWelcomeInitialViewControllerの子ViewControllerとして表示されます。

**主要な操作・処理内容**：
1. ページスワイプ - 左右スワイプで前後のページへ移動
2. 次へボタン押下 - 次のページへアニメーション付きで移動
3. スキップボタン押下 - ウェルカムフローを即座に終了
4. ページインジケータ - 現在のページ位置を視覚的に表示（タップ不可）

**画面遷移**：
- 遷移元：WelcomeViewController、WMFWelcomeInitialViewController
- 遷移先：なし（最終ページで開始ボタンを押すとdismiss）

**権限による表示制御**：
親画面（Welcome画面）と同様、初回起動時のみ表示されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 63 | 初回起動ウェルカム | 補助機能 | ウェルカムページのページング |

## 画面種別

オンボーディング（ページングViewController）

## URL/ルーティング

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

## 入出力項目

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

## 表示項目

| 項目名 | 表示内容 | データソース |
|--------|----------|--------------|
| ページコンテンツ | 各ウェルカムページ | pageControllers配列 |
| ページインジケータ | ドット形式 | UIPageControl |
| 次へボタン | "Next" | CommonStrings.nextTitle |
| スキップボタン | "Skip" | CommonStrings.skipTitle |

## イベント仕様

### 1-次へボタンタップ

**トリガー**: nextButtonタップ

**処理フロー**:
1. 現在表示中のViewControllerを取得
2. showNextWelcomePage()を呼び出し
3. 現在のインデックスを確認、最終ページなら画面dismiss
4. 最終ページでない場合、次のページをアニメーション付きで表示
5. RTL言語対応でnavigationDirectionを調整

### 2-スキップボタンタップ

**トリガー**: skipButtonタップ

**処理フロー**:
1. dismiss(animated: true)で画面を閉じる
2. completionBlock?()を実行

### 3-ページスワイプ

**トリガー**: ユーザーによる左右スワイプ

**処理フロー**:
1. UIPageViewControllerDelegateのpageViewController:didFinishAnimating:で検知
2. transitionCompletedがtrueの場合のみ処理
3. hideButtons(for:)で最終ページ判定とボタン表示制御

### 4-ナビゲーションデリゲート

**トリガー**: showNextWelcomePage()が呼び出された時

**処理フロー**:
1. WMFWelcomeNavigationDelegateプロトコルメソッド
2. senderのViewControllerからインデックスを取得
3. 最終ページの場合はdismiss、それ以外は次ページ表示

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

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

## メッセージ仕様

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

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| pageControllers空配列 | 初期表示で最初のページを設定できずクラッシュの可能性 |
| senderがpageControllersに存在しない | early return（何も実行しない） |

## 備考

- UIPageViewControllerを継承
- UIPageViewControllerDataSourceとUIPageViewControllerDelegateを自身で実装
- WMFWelcomeNavigationDelegateプロトコルを実装し、子ViewControllerからのナビゲーション要求を処理
- Themeableプロトコルに準拠
- pageControllersはlazyプロパティで、4つのWMFWelcomeContainerViewControllerを含む
- pageControlは最初のUIPageControl子ビューを検索して取得
- RTL言語対応：UIApplication.shared.wmf_isRTLでnavigationDirectionを反転
- 最終ページでは次へボタン、スキップボタン、ページインジケータをフェードアウト
- ボタンフォントはWMFFont.for(.mediumFootnote)
- scrollView.clipsToBounds = falseで視覚効果を調整

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

ページタイプとナビゲーションデリゲートの定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WMFWelcomePageViewController.swift | `Wikipedia/Code/WMFWelcomePageViewController.swift` | WMFWelcomePageType enum（3-8行目）、WMFWelcomeNavigationDelegateプロトコル（10-12行目） |

**読解のコツ**: WMFWelcomePageTypeは4つのページタイプ（intro、exploration、languages、analytics）を定義し、各ページのコンテンツを決定します。

#### Step 2: ページコントローラの構成を理解する

pageControllersの構成とコンテナViewControllerの生成を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | WMFWelcomePageViewController.swift | `Wikipedia/Code/WMFWelcomePageViewController.swift` | pageControllers（85-92行目）、containerControllerForWelcomePageType（77-83行目） |

**主要処理フロー**:
- **77-83行目**: WMFWelcomeContainerViewControllerを生成してdelegate設定
- **85-92行目**: 4つのページタイプに対応するコントローラを配列で保持

#### Step 3: viewDidLoadとUI設定を理解する

初期化処理とボタン・ページコントロールの設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | WMFWelcomePageViewController.swift | `Wikipedia/Code/WMFWelcomePageViewController.swift` | viewDidLoad（104-121行目）、configureAndAddNextButton（123-140行目）、configureAndAddSkipButton（142-158行目） |

**主要処理フロー**:
- **104-107行目**: dataSource, delegate設定
- **109-111行目**: RTL対応で最初のページを設定
- **113-114行目**: ボタン追加
- **123-140行目**: 次へボタンのAutoLayout設定
- **142-158行目**: スキップボタンのAutoLayout設定

#### Step 4: ナビゲーション処理を理解する

ページ遷移とボタンの表示/非表示制御を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | WMFWelcomePageViewController.swift | `Wikipedia/Code/WMFWelcomePageViewController.swift` | showNextWelcomePage（50-63行目）、hideButtons（224-235行目） |

**主要処理フロー**:
- **50-54行目**: 最終ページ判定とdismiss
- **55-62行目**: 次ページへのアニメーション遷移
- **224-235行目**: 最終ページでのボタン・インジケータフェードアウト

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

```
WMFWelcomePageViewController
    │
    ├─ viewDidLoad() [104行目]
    │      ├─ dataSource, delegate設定
    │      ├─ setViewControllers() [111行目]
    │      │      └─ pageControllers.first!表示
    │      │
    │      ├─ configureAndAddNextButton() [123行目]
    │      │      └─ 次へボタン追加・AutoLayout
    │      │
    │      └─ configureAndAddSkipButton() [142行目]
    │             └─ スキップボタン追加・AutoLayout
    │
    ├─ [次へボタンタップ]
    │      └─ nextButtonTapped() [178行目]
    │             └─ showNextWelcomePage() [50行目]
    │                    ├─ 最終ページ: dismiss()
    │                    └─ 次ページ: setViewControllers()
    │
    ├─ [スキップボタンタップ]
    │      └─ skipButtonTapped() [184行目]
    │             └─ dismiss() + completionBlock?()
    │
    └─ [スワイプ完了]
           └─ pageViewController:didFinishAnimating: [218行目]
                  └─ hideButtons(for:) [224行目]
                         └─ ボタン・インジケータのアルファ制御
```

### データフロー図

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

pageControllers ─────▶ UIPageViewController
    (4ページ)                 │
                             ├─▶ intro (WMFWelcomeContainerViewController)
                             ├─▶ exploration
                             ├─▶ languages
                             └─▶ analytics
                                      │
                                      │ 最終ページ
                                      ▼
                               [開始ボタンタップ]
                                      │
                                      ▼
                               dismiss()
                               completionBlock?()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WMFWelcomePageViewController.swift | `Wikipedia/Code/WMFWelcomePageViewController.swift` | ソース | メインViewController |
| WMFWelcomeContainerViewController.swift | `Wikipedia/Code/WMFWelcomeContainerViewController.swift` | ソース | 各ページのコンテナ |
| WelcomeViewController.swift | `Wikipedia/Code/WelcomeViewController.swift` | ソース | 親ViewController |
| WMFWelcomeInitialViewController.swift | `Wikipedia/Code/WMFWelcomeInitialViewController.swift` | ソース | 代替の親ViewController |
| CommonStrings.swift | `Wikipedia/Code/CommonStrings.swift` | ソース | ボタンテキスト定義 |
| WMFFont | `WMFComponents/` | ソース | フォント定義 |
