2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Swift/TableView】セルタップ時のハイライト実装4パターン

2
Last updated at Posted at 2020-12-29

セルタップ時のハイライト実装について、
納得のいく記事が見られなかったので備忘録として。
基本的にコードベースなのでstoryboard信者ならリターンをおすすめしたい。

よく見られたのが、
・UIViewを作成してselectedBackgroundViewに代入するというもの。
個人的にあまり好きじゃない。
とりあえずまとめてみる。

SelectionStyle

//tableViewのcellForRowAtを設定する関数内で
//selectionStyleを設定する。
cell.selectionStyle = .gray
cell.selectionStyle = .none
cell.selectionStyle = .blue

スクリーンショット 2020-12-29 11.13.36.png
selectionStyleでは、この画像でいうTestCellの階層の背景色に適用されるため、
次の階層のビューに色をつけるとビューが被りハイライトが見えなくなる。
そのため、selectionStyleの実装時には一番上の階層、TestCellに背景色をつけ、
小要素の背景色は基本的に.clearにしておく必要がある。
余白を持たせたり、複雑なカスタムセルの場合、この方法ではやりにくい。

selectedBackGroundView

お馴染み、いろいろな記事で紹介されている。あまり好きじゃない。

//tableViewのcellForRowAtを設定する関数内で設定
let backgroundView = UIView()
backgroundView.backgroundColor = .red
cell.selectedBackgroundView = backgroundView

うん、まじで好きじゃない。

カスタムセルクラスのsetSelected関数

カスタムセルクラスを使わない、平凡なTableViewの場合、一番上のSelectionStyleが一番無難だが、
多くの場合はカスタムセルクラスを使うと思う。
スクリーンショット 2020-12-29 11.13.36.png


//画像のように、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
    }
}

おわりに

他にも良い方法があったら
コメントで教えてください〜

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?