6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UICollectionViewFlowLayoutでヘッダーとフッターを設定する

Last updated at Posted at 2018-04-24

フローレイアウト(UICollectionViewFlowLayout)で、セクションごとにヘッダーとフッターを設定してみたいと思います。

StoryBoardはこんな感じです。
Collection Reusable ViewをオブジェクトライブラリからCollectionViewにドラッグ&ドロップすると、セルの上下に配置されます。
フローレイアウトではこれらがヘッダーおよびフッターになります。

image.png

ViewControllerの実装は以下のとおりです。

ViewController
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.dataSource = self
    }
}

extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.backgroundColor = .red

        return cell
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 2
    }

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let identifier: String
        let bgColor: UIColor

        if kind == UICollectionElementKindSectionHeader {
            identifier = "Header"
            bgColor = .blue
        } else {
            identifier = "Footer"
            bgColor = .yellow
        }

        let supplement = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: identifier, for: indexPath)
        supplement.backgroundColor = bgColor

        return supplement
    }
}

ヘッダーおよびフッターの設定をしているのは、UICollectionViewDataSourceのcollectionView: viewForSupplementaryElementOfKind:at:というメソッドです。

引数kindには、種類文字列と呼ばれる識別子が格納されています。
セルと違い、補助ビューは再利用識別子と種類文字列の2つの識別子を持っており、オブジェクトの再利用時に使用します。

フローレイアウトでは、種類文字列はUICollectionElementKindSectionHeaderおよびUICollectionElementKindSectionFooterという定数が定義されています。
ここではこれらの定数を利用して、UICollectionElementKindSectionHeaderつまりヘッダーの場合は背景を青に、それ以外つまりフッターの場合は背景を黄色に設定しています。

セルについては、2つのセクションそれぞれに10個ずつのセルが配置されるようにしました。

上記のコードを実行すると、以下のような画面になります。

image.png

セクションごとにヘッダー(青)とフッター(黄色)が配置されているのがわかります。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?