Сводка
Это решение позволяет вам заблокировать некоторые цвета фона ячейки , а остальные контролируются поведением системы.
Основываясь на ответе mientus , я создал решение, позволяющее указать, какие виды должны сохранять цвет фона .
Это по-прежнему позволяет другим подсвечам ячеек удалять свой фон при выделении / выделении, и это единственное решение, которое работает в нашем случае (для двух представлений требуется постоянный фон).
Я использовалпротокол-ориентированный подход, с протоколом BackgroundLockable
, содержащим список представлений для блокировки, и запуском закрытия с сохранением цветов:
protocol BackgroundLockable {
var lockedBackgroundViews: [UIView] { get }
func performActionWithLockedViews(_ action: @escaping () -> Void)
}
extension BackgroundLockable {
func performActionWithLockedViews(_ action: @escaping () -> Void) {
let lockedViewToColorMap = lockedBackgroundViews.reduce([:]) { (partialResult, view) -> [UIView: UIColor?] in
var mutableResult = partialResult
mutableResult[view] = view.backgroundColor
return mutableResult
}
action()
lockedViewToColorMap.forEach { (view: UIView, color: UIColor?) in
view.backgroundColor = color
}
}
}
Тогда у меня есть подкласс UITableViewCell
, который переопределяет выделениеи выбор для запуска закрытия протокола вокруг вызова стандартного (супер) поведения:
class LockableBackgroundTableViewCell: UITableViewCell, BackgroundLockable {
var lockedBackgroundViews: [UIView] {
return []
}
override func setHighlighted(_ highlighted: Bool, animated: Bool) {
performActionWithLockedViews {
super.setHighlighted(highlighted, animated: animated)
}
}
override func setSelected(_ selected: Bool, animated: Bool) {
performActionWithLockedViews {
super.setSelected(selected, animated: animated)
}
}
}
Теперь мне просто нужно создать подкласс LockableBackgroundTableViewCell
или использовать протокол BackgroundLockable
в классе ячеек, чтобы легко добавить поведение блокировкив некоторые клетки!
class SomeCell: LockableBackgroundTableViewCell {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var icon: UIImageView!
@IBOutlet weak var button: UIButton!
override var lockedBackgroundViews: [UIView] {
return [label, icon]
}
}