Резюме
Это решение позволяет вам заблокировать некоторые цвета фона Клетки в, а остальные находятся под контролем поведения системы.
на основе mientus' answer, я создал решение, которое позволяет указать, какие виды должны держать их цвет фона.
Это все еще позволяет другим подзонам на ячейке удалять фон на выделение/выделение и является единственным решением, которое работает в нашем случае (два вида, требующие постоянного фона).
Я использовал подход протокольный-ориентированный, с 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
прото col в классе ячейки, чтобы легко добавить поведение блокировки в некоторые ячейки!
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]
}
}
Какие другие интерфейсные элементы внутри представления, которые покрываются цветом выбора ячейки? – hennes
В настоящее время это всего лишь изображение. Он предназначен для того, чтобы изображение выглядело как фотография. Позже я также добавлю ярлык. – P5ycH0