プログラミング

【Swift】UITableViewのセクションヘッダーに独自のViewを表示する

swift-eyecatch

UITableViewは殆どの場合、カスタムセルで表示させると思いますが、セクションヘッダー(フッター)も使用するとなれば、独自のデザインで実装することがほとんどです。

2年前はこの実装方法がわからずセクションヘッダーにnibを表示出来ないエラーに阻まれ、結局セクションを区切ってセクションヘッダーのように実装するということを行っていました。

しかし解決方法は単純でした。

nibの継承を”UIView”ではなく”UITableViewHeaderFooterView”にし、カスタムセルと同様にtableViewにregisterする必要があるのでした。。。

今回はUITableViewのセクションヘッダーにカスタムセルを表示する方法を記載します。

カスタムのnibを作成する

「New File」から「Cocoa Touch Class」を選択し、「Subclass of」に”UITableViewHeaderFooterView”を選択します。ファイル名も”CustomeHeaderView”などで自由に指定します。

uitableview-custome-header

これにより、”CustomeHeaderView”が作成されます。

この時、”Also create XIB file”を選択することは出来ず、自分で再度「New File」から”View”を選択し、別途作成する必要があります。ファイル名は上記で作成したファイル名と同じ名前にします。例えば、「CustomeHeaderView.xib」となります。
uitableview-custome-header

あとは、xibファイルの編集等で、レイアウト等を編集していきます。

UITableViewから独自のセクションヘッダーを呼び出す

こちらもカスタムセルの時と同様に、UITableViewにregisterする必要があります。

UITableViewに独自のセクションヘッダーをregisterする

@IBOutlet weak var tableView: UITableView! {
    didSet {
        tableView.register(
            UINib(nibName: String(describing: CustomeHeaderView.self), bundle: nil),
            forHeaderFooterViewReuseIdentifier: String(describing: CustomeHeaderView.self)
        )
    }
}

カスタムセルをregisterする時と全く同じ手順です。

違うのは、呼び出す時です。

UITableViewで独自のセクションヘッダーを呼ぶ

カスタムセルを表示させるときは”tableView(cellForRowAt)”で、こちらはUITableViewDataSourceの必須の関数でした。

セクションヘッダー(フッターも)は必須ではないので、追加してあげる必要があります。

Xcodeの補完機能を用いて、追加します。
“func tableViewviewfor…..”と入力していくと、”viewForHeaderInSection”の関数が表示されるので、それを選択します。便利!

uitableview-custome-header
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: String(describing: CustomeHeaderView.self))
    if let headerView = view as? CustomeHeaderView {
        headerView.someFunction()
        return headerView
    }
    return nil
}

“viewForHeaderInSection”の関数は戻り値が”UIView?”なので、“viewForHeaderInSection”内で、定義したカスタムセクションヘッダーを返すようにします。

これでセクションヘッダーに独自のviewを表示させることが出来るようになります。

ただし、セクションヘッダーにはデフォルトの背景色が表示されてしまうので、こちらも併せて修正してあげると良いです。

セクションヘッダーの背景色を変更

セクションヘッダーの背景色を変更するには、UITableViewDataSourceプロトコルにて、”willDisplayHeaderView”を追加します。

このviewのtintColorプロパティにカラーを指定してあげると、セクションの背景色を変更することが出来ます。

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    view.tintColor = .clear
}

セクションヘッダーの高さを指定する

セクションのヘッダーの高さも指定することが可能です。デザインの要件に併せて指定します。

“heightForHeaderInSection”を追加して、CGFloatを返すようにするだけです。

もしセクションヘッダーに複雑なデザインを実装する場合は、この記述が必要になってきます。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 60.0
}