はじめに
TableViewを使うときは毎回セルとかヘッダー・フッターのカスタムクラス作ったりしてたけどデフォルトのやつでも色々できるやん?ってことで色々作ってみました。
| Cell Style | AccessoryType | Color Cell | Selected Color |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Separator Style | Table Style | Grouped Detail | Color Section |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
TableViewControllerを使うか否か
画面にtableViewしか表示しないって場合は基本的には UITableViewController を使う方が便利なのでできるだけ UITableViewController を使います。
便利機能
- tableViewのひも付けとかしなくてもいい
- var clearsSelectionOnViewWillAppear: Bool
- var refreshControl: UIRefreshControl?
- 編集モードの時に
func setEditing(_ editing: Bool, animated: Bool)オーバーライドしなくてもいい - キーボード表示時に自動でスクロールしてくれる
- static cell が使える
- セーフエリアまわりもなんかいい感じにしてくれる
Cell Style
UITableViewCell には下記の Style があります。
- default (Basic)
- value1 (Right Detail)
- value2 (Left Detail)
- subtitle (Subtitle)
こんな感じ。
default (Basic) 以外は detail テキストも設定できる。value2 (Left Detail) 以外は image も設定できる。
下記のように設定
cell.textLabel?.text = "title"
cell.detailTextLabel?.text = "detail"
cell.imageView?.image = UIImage(named: "sample")
Cell AccessoryType
UITableViewCell には下記の AccessoryType があります。
- none
- disclosureIndicator
- detailDisclosureButton
- checkmark
- detailButton
こんな感じ。
下記のように設定(もしくは Storyboard で設定)
cell.accessoryType = .none
cell.tintColor = .red // 色設定(disclosureIndicatorは変わらない)
Cell 背景色
UITableViewCell の背景色を設定する。
こんな感じ。
下記のように設定
if cell.backgroundView == nil {
cell.backgroundView = UIView()
}
cell.backgroundView?.backgroundColor = .red
上記のように backgroundView を設定する。確か cell.backgroundColor = .red はダメだった気がするけど動いた(勝手にいい感じにしてくれるのかも??)
Cell 選択時の背景色
UITableViewCell の選択時の背景色を設定する。
こんな感じ。
下記のように設定
let v = UIView()
v.backgroundColor = .red
cell.selectedBackgroundView = v
選択時の背景色の設定はよくわからない...
cell.selectedBackgroundView?.backgroundColor = .red ではダメだった![]()
リファレンスに下記のように書いてあるが別に nil でもなかった...
Default is nil for cells in UITableViewStylePlain, and non-nil for UITableViewStyleGrouped.
Separator
Style
UITableView には下記の SeparatorStyle があります。
- none
- singleLine (Default)
- singleLineEtched (deprecated)
こんな感じ。
Storyboard で設定する場合は Default も含めて4パターンあるが Default は singleLine なので変わらない。また、singleLineEtched は Deprecated になっておりこちらも singleLine 同様の見た目になった。(tableView のスタイルを Grouped にしても変化なし)
なので SeparatorStyle は下記の2パターンのみ
- none
- singleLine
下記のように設定(もしくは Storyboard で設定)
tableView.separatorStyle = .none
Color
区切り線も色も設定できるが、セルごとの設定は不可。
こんな感じ。
下記のように設定(もしくは Storyboard で設定)
tableView.separatorColor = .blue
Inset
区切り線の inset はセルごとの設定も可。
こんな感じ。
| テーブルに設定 | セルごとに設定 |
|---|---|
![]() |
![]() |
下記のように設定(もしくは Storyboard で設定)
// すべて同じ値を設定する場合
tableView.separatorInset = .zero
// セルごとに設定する場合
cell.separatorInset = .init(top: 0, left: 15 * CGFloat(indexPath.row), bottom: 0, right: 0)
小技(セルがない部分の区切り線を消す)
下記のようにするとセルがない部分の区切り線を消すことができる![]()
tableView.tableFooterView = UIView()
| 通常 | footer設定 |
|---|---|
![]() |
![]() |
Table Style
UITableView には下記の Style があります。
- plain
- grouped
- insetGrouped
こんな感じ。(Plain とか表示してるのは TableView とは関係ないただの label です)
instGrouped はそのままだとわかりにくいので tableView の背景色を変えています。
ぱっと見わかりにくいですが下記のようにヘッダー・フッターを設定すると違いがわかります。
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "section header \(section)"
}
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
return "section footer \(section)"
}
plain の場合スクロールしてもヘッダー部分は固定される。
grouped と insetGrouped の場合スクロールするとヘッダー部分も一緒にスクロールされる。ヘッダーの文字はすべて大文字になる。
| grouped | insetGrouped |
|---|---|
![]() |
![]() |
小技(ヘッダー・フッターの文字色を変える)
下記のようにするとヘッダー・フッターの文字色を設定できる![]()
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
(view as? UITableViewHeaderFooterView)?.textLabel?.textColor = .red
}
func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {
(view as? UITableViewHeaderFooterView)?.textLabel?.textColor = .blue
}
こんな感じ
Grouped の detailText 設定
grouped と insetGrouped の場合ヘッダー部分に detailTextLabel を設定できる。
If you configured your table view with the group style, you can also configure the detailTextLabel property.
こんな感じ(ヘッダーは大文字にならない)
下記のように設定する。
Storyboardで Sections のところの Automatic にチェックをつける
これをしておかないと textLabel と detailTextLabel が重なったりする。
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
var header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
if header == nil {
header = UITableViewHeaderFooterView(reuseIdentifier: "header")
}
header?.textLabel?.text = "section header \(section)"
header?.detailTextLabel?.text = "detail"
return header
}
Section Color (ヘッダー・フッター)
セクションのヘッダー・フッターの背景色を設定する。
こんな感じ
下記のように設定する。
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
var header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header")
if header == nil {
header = UITableViewHeaderFooterView(reuseIdentifier: "header")
}
if header?.backgroundView == nil {
header?.backgroundView = UIView()
}
header?.backgroundView?.backgroundColor = .red
return header
}
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
var footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: "footer")
if footer == nil {
footer = UITableViewHeaderFooterView(reuseIdentifier: "footer")
}
if footer?.backgroundView == nil {
footer?.backgroundView = UIView()
}
footer?.backgroundView?.backgroundColor = .red
return footer
}
さいごに
カスタムクラスをつくらなくてもわりと色々できそう。
Table関連はよく使うけど実装方法忘れたりするのでもっと充実させたい。
プルリクくれてもええんやで![]()





