总结
此解决方案让您锁定单元格的某些背景颜色,而其余部分则由系统行为控制。
基于 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 协议即可轻松为某些单元添加锁定行为!
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]
}
}