とってもニッチな記事です
参考にする人は少なそうですが、せっかく仕事で触ったのでまとめておきます
UITableViewCellEditControl
, UITableViewCellReorderControl
とは
UITableView
で編集モードになったときに、左右に出てくる部品のことです。
編集モード?削除?並び替え?って感じの人はこちらの記事を見ると理解できるかと思います。
http://himaratsu.hatenablog.com/entry/tableview/editmode
画像を変更する
この方法はUITableView
の編集モードで複数選択が可能な場合にのみ正常に動作します
tableView.allowsMultipleSelectionDuringEditing = true
を前提としています
Debug View Hierarchyで見るとクラス名を知ることはできますが、コードからはこれらのクラス名を使うことはできません。
どうやらUITableViewCell
の直下にいるらしいので、subviews
で探せそうです。それぞれUIImageView
を持っていることもわかります。
UITableViewCell
のサブクラスを作って、UITableViewCellEditControl
とUITableViewCellReorderControl
が持っているUIImageView
に画像をセットする処理を書きます。
final class UITableViewCustomCell: UITableViewCell {
private func setEditControlImage() {
// UITableViewCellEditControlが持つimageViewを取得
let imageView = subviews.first { $0.description.contains("Edit") }?.subviews.first { $0 is UIImageView } as? UIImageView
// セルの選択状態に応じて適当な画像をセット
imageView?.image = isSelected ? #imageLiteral(resourceName: "thunder_black") : #imageLiteral(resourceName: "thunder_white")
}
private func setReorderControlImage() {
// UITableViewCellReorderControlが持つimageViewを取得
let imageView = subviews.first { $0.description.contains("Reorder") }?.subviews.first { $0 is UIImageView } as? UIImageView
// 適当な画像をセット
imageView?.image = #imageLiteral(resourceName: "swastika")
// そのままだと横長の画像になってしまうのでモード変更
imageView?.contentMode = .scaleAspectFit
}
}
後は適当なタイミングで画像をセットする処理を呼び出します。
extension UITableViewCustomCell {
// セルがハイライトされた
override func setHighlighted(_ highlighted: Bool, animated: Bool) {
super.setHighlighted(highlighted, animated: animated)
setEditControlImage()
}
// セルが選択された
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
setEditControlImage()
}
// セルの編集モードが変更された
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
setEditControlImage()
setReorderControlImage()
}
}
編集モードで複数選択以外にすると画像が戻ってしまう状況がある
編集モードで複数選択以外にすると、UITableViewCellEditControl
をタップするか、並び替えをすると、UITableViewCellEditControl
の画像がデフォルトのものに戻ってしまいます。
仕事では複数選択のときのみ考えればよかったので深く追いませんでしたが、どうすればうまくいくんでしょうか??
おわりに
割と無理やり標準部品の画像を変更してみました
こういうのをやると、いつもプロパティ用意しておいてほしいなと思います
OSのバージョンアップなどで使えなくなる可能性は十分にあるので、カスタムセルのビューでやるほうが無難かと思いますが、もしよければ使ってみてください!