表紙
大扉
はじめに
第1章 UICollectionViewの概要
1.1 UICollectionViewの特徴
1.2 UICollectionViewの考え方
1.3 UICollectionViewの学び方
第2章 UICollectionViewの最小限の実装
2.1 最小限の実装
2.2 ViewController / Repository
2.3 Layout
2.4 DataSource
2.5 Cell
2.6 実際の画面
2.7 UICollectionViewの設計
2.8 この章のまとめ
第3章 DataSourceの実装
3.1 DataSourceプロトコル
3.2 DiffableDataSourceクラス
3.3 DiffableDataSourceに変更して何が変わったか
3.4 DiffableDataSourceSnapshot
3.5 DiffableDataSourceで複数のセクション対応
3.6 Tips
3.7 この章のまとめ
第4章 Cellの実装
4.1 Cell関連の実装
4.2 CellRegistration
4.3 CellRegistration生成時の注意点
4.4 ContentConfiguration
4.5 複数のCellの登録
4.6 この章のまとめ
第5章 Layoutの実装
5.1 CompositionalLayout
5.2 Section
5.3 Item
5.4 Group
5.5 Group のネスト
5.6 この章のまとめ
第6章 その他のトピック
6.1 セルのタップ処理
6.2 セクションヘッダー
6.3 リスト
おわりに
奥付
UICollectionViewガイドブック

UICollectionViewガイドブック

宇佐見 公輔

Type D4 Lab

はじめに

UICollectionViewは、iOSアプリケーションの開発で使用される、コンテンツをグリッド状に表示するためのクラスです。Appleが提供するUIKitフレームワークの一部です。

UICollectionViewの導入はiOS 6(2012年リリース)でした。それまでのUIKitでは、コンテンツをリスト状に表示するUITableViewがありましたが、グリッド状に表示するには工夫が必要でした。UICollectionViewの導入によって、コンテンツをグリッド状に表示することが容易になりました。

以降、UIKitの重要なコンポーネントのひとつとして、iOSのバージョンアップに伴い機能やパフォーマンスが向上しており、現在でも引き続きアップデートされています。コンテンツを単にグリッド状に配置するだけでなく、レイアウトが柔軟に行えるのが特徴です。

しかし、その柔軟性ゆえに、実装の難易度は高めです。また、iOS 13や14でレイアウトやデータソースの新しい実装方法が追加されて便利になりましたが、それ以前とは別の考え方が必要になります。現在のUICollectionViewでは古い実装方法と新しい実装方法が混在していることもあって、全体像を把握するのが難しいと感じる方も多いのではないでしょうか。

そこで本書では、UICollectionViewの基本的な考え方を解説します。特に、iOS 13や14で導入された新しい実装方法を重点的に取り上げ、効率的で柔軟なレイアウトやデータソースの管理方法を解説します。

本書を通じて、iOSアプリ開発者がUICollectionViewを理解し効果的に活用できるようになることを目指しています。

第1章 UICollectionViewの概要

1.1 UICollectionViewの特徴

UICollectionViewは、コンテンツをグリッド状またはリスト状に表示するためのクラスです。データを柔軟かつ効率的に表示できます。

図1.1: UICollectionViewの画面の例

UICollectionViewの画面の例

以下のような特徴を持ちます。

  • グリッド表示:UICollectionViewは、データをグリッド形式で表示できます。これにより、画像ギャラリーやプロダクトカタログなど、複数のアイテムを整然としたレイアウトで見やすく表示可能です。
  • リスト表示:UICollectionViewを使って、データをリスト形式で表示できます。これにより、タスクリストやメッセージ一覧など、順序付けられたアイテムを縦方向にスクロールして閲覧できます。
  • カスタムレイアウト:UICollectionViewは、カスタムレイアウトを実装できます。これにより、アプリケーションの要件に合わせた独自のレイアウトを作成可能です。
  • セルの再利用:UICollectionViewは、セルの再利用機能を提供しています。これにより、大量のデータや複雑なレイアウトでもスムーズなスクロールを実現できます。セルの再利用は、メモリ消費を抑えることにも寄与します。
  • データの動的な更新:UICollectionViewは、データソースが変更されたときに簡単にコンテンツを更新できます。これにより、リアルタイムでデータが変更されるアプリケーションでも、スムーズな表示が実現できます。
  • セクションとヘッダー、フッター:UICollectionViewでは、データを複数のセクションに分けて表示できます。また、各セクションにヘッダーやフッターを追加することで、データをより整理された形で表示可能です。
  • アイテムの選択と編集:UICollectionViewでは、アイテムを選択したり、編集モードに入ってアイテムを削除や並び替えを行ったりできます。これにより、ユーザーがアプリケーション内でアイテムを簡単に操作できるようになります。
  • アニメーションとインタラクション:UICollectionViewは、アイテムの追加、削除、移動などの操作にアニメーションを適用できます。これにより、アプリケーションの操作性や見た目を向上させることができます。

これらの機能を組み合わせることで、UICollectionViewはさまざまなシーンでのデータ表示に適したUIコンポーネントとなっています。また、UICollectionViewはUIKitフレームワークの一部であるため、iOSアプリケーション開発において幅広く利用されています。

1.2 UICollectionViewの考え方

UICollectionViewは、データの表示と管理に関して、3つの主要なコンポーネントに分ける考え方があります。

  • Data
  • Layout
  • Presentation

これらのコンポーネントは、それぞれDataSourceクラス、Layoutクラス、Cellクラスに対応しています。このアーキテクチャにより、各コンポーネントの役割が明確になり、アプリケーションの開発が容易になります。

1.3 UICollectionViewの学び方

UICollectionViewは、歴史が古く構成要素も多いため、いざ学ぼうとすると案外大変です。最初の、動く画面を作るまでにも案外手間がかかります。

しかしやはり、プログラミングを学ぶうえでは、実際に動かすことが大切です。

そこで本書では、まず最小限の実装で動く画面を作ります。そうして基本的な構成要素に触れたあとで、それぞれの構成要素を詳しく見ていくことにします。

第2章 UICollectionViewの最小限の実装

2.1 最小限の実装

UICollectionViewを理解するために、まずはできるだけ小さな実装から始めることにします。なお、本章で説明する実装はiOS 14以降で動作するものです。

できるだけ小さな実装と言っても、UICollectionViewを構成する要素は多いため、実装もある程度は大きくなってしまいます。大きく分けると、実装は次の4つのパートからなります。

  • ViewController / Repository
  • Layout
  • DataSource
  • Cell

本章ではこれらを順に説明します。

2.2 ViewController / Repository

まずは UICollectionView を含む画面を作ります。ここでは、その画面のViewControllerクラスを MyViewController という名前で作ります。また、画面に表示するデータを取得するためのクラス MyItemRepository も作ります。

リスト2.1: MyViewController.swift

import UIKit

final class MyViewController: UIViewController {
    private let repository = MyItemRepository()
    private var collectionView: UICollectionView!
    private var dataSource: MyCollectionViewDataSource!

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView = UICollectionView(
            frame: .zero,
            collectionViewLayout: makeCollectionViewLayout()
        )
        setupConstraints()

        dataSource = MyCollectionViewDataSource(repository: repository)

        collectionView.dataSource = dataSource
        collectionView.reloadData()
    }

    private func setupConstraints() {
        view.addSubview(collectionView)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            collectionView.topAnchor.constraint(equalTo: view.topAnchor),
            collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        ])
    }
}

UICollectionView を生成するには、UICollectionViewLayout を与える必要があります。ここでは、makeCollectionViewLayout() メソッドで生成しています。これは後述します。

画面上に UICollectionView を配置するためにAuto Layoutを使うことにします。setupConstraints() メソッドで制約を設定しています。

UICollectionView に表示する内容はプロパティ dataSource で与えます。ここでは、MyCollectionViewDataSource クラスとして実装しています。これは後述します。

その後、reloadData() メソッドを呼ぶことで dataSource にセットされた値が表示されます。

MyCollectionViewDataSource に渡している MyItemRepository の実装は次のとおりです。実際のアプリではデータをAPIやDBから取得することになるでしょうが、今回は簡単のためにメモリ上にデータを生成しています。

リスト2.2: MyItemRepository.swift

import Foundation

struct MyItem {
    let name: String
}

final class MyItemRepository {
    private var items = (0..<30).map { MyItem(name: "Item \($0)") }

    func numberOfItems() -> Int {
        items.count
    }

    func item(at index: Int) -> MyItem {
        items[index]
    }
}
試し読みはここまでです。
この続きは、製品版でお楽しみください。