セルタップ時のハイライト実装について、
納得のいく記事が見られなかったので備忘録として。
基本的にコードベースなのでstoryboard信者ならリターンをおすすめしたい。
よく見られたのが、
・UIViewを作成してselectedBackgroundViewに代入するというもの。
個人的にあまり好きじゃない。
とりあえずまとめてみる。
SelectionStyle
//tableViewのcellForRowAtを設定する関数内で
//selectionStyleを設定する。
cell.selectionStyle = .gray
cell.selectionStyle = .none
cell.selectionStyle = .blue

selectionStyleでは、この画像でいうTestCellの階層の背景色に適用されるため、
次の階層のビューに色をつけるとビューが被りハイライトが見えなくなる。
そのため、selectionStyleの実装時には一番上の階層、TestCellに背景色をつけ、
小要素の背景色は基本的に.clearにしておく必要がある。
余白を持たせたり、複雑なカスタムセルの場合、この方法ではやりにくい。
selectedBackGroundView
お馴染み、いろいろな記事で紹介されている。あまり好きじゃない。
//tableViewのcellForRowAtを設定する関数内で設定
let backgroundView = UIView()
backgroundView.backgroundColor = .red
cell.selectedBackgroundView = backgroundView
うん、まじで好きじゃない。
カスタムセルクラスのsetSelected関数
カスタムセルクラスを使わない、平凡なTableViewの場合、一番上のSelectionStyleが一番無難だが、
多くの場合はカスタムセルクラスを使うと思う。

//画像のように、TestCellの小要素にbaseViewを用意することで、
//より複雑なレイアウトを組むことができるが、その場合は
//ハイライトをbaseViewに対して表現することで実装できる。
//選択されたときの挙動を設定する関数、引数selectedには選択されたらtrue、
//そうでなければfalseが渡されるので、それに合わせて関数内で条件分岐を作り、
//レイアウトの設定をする。
// 条件 ? A : B はエルビス演算子。条件がtrueならA、falseならBになる。
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
baseView.backgroundColor = selected ? .lightGray : .white
// Configure the view for the selected state
}
カスタムセルの時は大体これかも。個人的にもよく使う。
override var isHighlighted / isSelected
これは初学者には新しい書き方かもしれない。同じくカスタムセルクラスに記述する。
これも個人的によく使う。
//カスタムセルクラスにグローバル変数として記述する。
//これらはcellのクラスに用意されている変数
//セルがハイライトされているセルなら
//isHighlighted変数にはtrue、そうでなければfalseが代入される。
override var isHighlighted: Bool {
didSet {
baseView.backgroundColor = isHighlighted ? .lightGray : .white
}
}
//セルが選択されたらisSelectedにtrue、
//そうでなければfalseが入る
override var isSelected: Bool {
didSet {
baseView.backgroundColor = isSelected ? .lightGray : .white
}
}
おわりに
他にも良い方法があったら
コメントで教えてください〜