# 機能設計書 19-地図/リスト切替

## 概要

本ドキュメントは、Wikipedia iOSアプリにおける「地図/リスト切替」機能の設計を記述する。この機能は、Places画面において地図表示とリスト表示を切り替えることを可能にするものである。

### 本機能の処理概要

**業務上の目的・背景**：ユーザーによって、地図ベースの空間的な探索が適している場合と、一覧形式での効率的なスキャンが適している場合がある。地図/リスト切替機能により、ユーザーは自分の好みや状況に応じて最適な表示形式を選択できる。また、VoiceOverなどのアクセシビリティ機能使用時は、リスト表示の方が操作しやすいため、自動的にリストモードがデフォルトとなる。

**機能の利用シーン**：Places画面のナビゲーションバーにあるセグメントコントロール（またはスコープバー）をタップすることで、地図表示とリスト表示を切り替える。切り替えはアニメーション付きで行われ、表示中のデータはそのまま保持される。

**主要な処理内容**：
1. セグメントコントロールの表示（Map/List）
2. 地図モードとリストモードの切り替え
3. 切り替え時のアニメーション
4. 各モードに適したUI表示
5. アクセシビリティ対応（VoiceOver時のデフォルト設定）

**関連システム・外部連携**：特になし。UI切替のみの処理。

**権限による制御**：本機能は認証不要で利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | Places画面 | 主画面 | 地図/リスト表示切替 |

## 機能種別

UI切替 / 表示モード変更

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| viewMode | ViewMode | Yes | 表示モード（map/list/listOverlay） | - |

### 入力データソース

- 画面操作：セグメントコントロール（mapListToggle）
- スコープバー：検索バーのスコープボタン

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| viewMode | ViewMode | 現在の表示モード |
| isViewModeOverlay | Bool | オーバーレイモードかどうか |

### 出力先

- 画面表示：地図/リストの表示切替

## 処理フロー

### 処理シーケンス

```
1. セグメントコントロールタップ
   └─ updateViewModeFromSegmentedControl() が呼ばれる
2. viewModeプロパティ更新
   └─ didSet で表示更新処理
3. 地図/リストの表示切替
   └─ updateViewModeToMap() または updateViewModeToList()
4. アニメーション実行
   └─ listAndSearchOverlayの表示/非表示切替
5. CollectionViewのデータ切替
   └─ listViewControllerのarticlesを更新
```

### フローチャート

```mermaid
flowchart TD
    A[セグメントタップ] --> B{選択値}
    B -->|Map| C[viewMode = .map]
    B -->|List| D[viewMode = .list]
    C --> E[updateViewModeToMap]
    D --> F[updateViewModeToList]
    E --> G[地図を前面に表示]
    F --> H[リストを前面に表示]
    G --> I[オーバーレイ非表示]
    H --> J[オーバーレイ非表示]
    I --> K[UI更新完了]
    J --> K
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-19-01 | VoiceOverデフォルト | VoiceOver有効時はリストモードをデフォルト表示 | 画面初回表示時 |
| BR-19-02 | スコープバー表示 | オーバーレイモードでない場合のみスコープバー表示 | 検索バー表示時 |
| BR-19-03 | データ共有 | 地図とリストで同じデータを表示 | 表示切替時 |
| BR-19-04 | セグメント同期 | セグメントコントロールの選択状態を表示モードと同期 | 表示モード変更時 |

### 計算ロジック

特になし。

## データベース操作仕様

### 操作別データベース影響一覧

データベース操作なし。UI表示切替のみ。

## エラー処理

### エラーケース一覧

エラーケースなし。UI切替のみのためエラーは発生しない。

## トランザクション仕様

トランザクション処理なし。

## パフォーマンス要件

- 切替アニメーションはスムーズに実行（60fps）
- 切替後のデータ表示は即座に行う

## セキュリティ考慮事項

セキュリティ上の考慮事項なし。

## 備考

ViewModeはenum型で定義され、map/list/listOverlayの3つの状態を持つ。listOverlayは地図の上にリストをオーバーレイ表示するモード。

---

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

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

### 推奨読解順序

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

表示モードのenumを理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ViewMode | `Wikipedia/Code/PlacesViewController.swift` | map/list/listOverlayの3モード |

**読解のコツ**: ViewModeはPlacesViewControllerの内部enumとして定義されている可能性が高い。地図とリストの表示状態を管理。

#### Step 2: セグメントコントロールを理解する

mapListToggleがUI切替の起点。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | PlacesViewController.swift | `Wikipedia/Code/PlacesViewController.swift` | セグメントコントロール定義と処理 |

**主要処理フロー**:
1. **97-114行目**: mapListToggle初期化 - Map/Listの2セグメント
2. **103-114行目**: セグメント設定 - 画像とアクセシビリティラベル
3. updateViewModeFromSegmentedControlでモード変更処理

#### Step 3: 表示モード切替処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | PlacesViewController.swift | `Wikipedia/Code/PlacesViewController.swift` | viewModeプロパティとdidSet |

**主要処理フロー**:
- viewMode didSet - 表示更新トリガー
- updateViewModeToMap() - 地図モードへの切替
- updateViewModeToList() - リストモードへの切替

#### Step 4: スコープバーを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | PlacesViewController.swift | `Wikipedia/Code/PlacesViewController.swift` | ナビゲーションバー設定 |

**主要処理フロー**:
- **273-291行目**: configureNavigationBar - スコープバー設定
- **285-286行目**: showsScopeBar, scopeButtonTitlesの条件分岐
- **293-305行目**: updateScopeBarVisibility - スコープバー表示更新

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

```
PlacesViewController
    │
    ├─ mapListToggle (UISegmentedControl)
    │      └─ updateViewModeFromSegmentedControl
    │             └─ viewMode設定
    │
    ├─ viewMode (didSet)
    │      ├─ updateViewModeToMap()
    │      └─ updateViewModeToList()
    │
    └─ searchBar scopeBar
           └─ updateScopeBarVisibility()
```

### データフロー図

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

セグメントタップ ───▶ viewMode変更 ───▶ UI表示切替
スコープバー選択           │
                          ├─▶ 地図表示/非表示
                          ├─▶ リスト表示/非表示
                          └─▶ オーバーレイ制御
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| PlacesViewController.swift | `Wikipedia/Code/` | ソース | Places画面ViewController |
| ArticleLocationCollectionViewController.swift | `Wikipedia/Code/` | ソース | リスト表示用ViewController |
| MapView | `Wikipedia/Code/` | ソース | 地図表示用ビュー |
