Zusammenfassung
Mit dieser Lösung können Sie einige Hintergrundfarben einer Zelle sperren , während der Rest vom Systemverhalten gesteuert wird.
Basierend auf der Antwort von mientus habe ich eine Lösung erstellt, mit der Sie festlegen können, welche Ansichten ihre Hintergrundfarbe behalten sollen .
Dies ermöglicht weiterhin, dass der Hintergrund anderer Zellen-Unteransichten beim Hervorheben / Auswählen entfernt wird, und ist die einzige Lösung, die in unserem Fall funktioniert (zwei Ansichten benötigen einen permanenten Hintergrund).
Ich habe einen protokollorientierten Ansatz verwendet, bei dem ein BackgroundLockable
Protokoll die Liste der zu sperrenden Ansichten enthält und ein Abschluss ausgeführt wird, während die Farben beibehalten werden:
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
}
}
}
Dann habe ich eine Unterklasse von UITableViewCell
, die das Hervorheben und Auswählen überschreibt, um den Abschluss des Protokolls auszuführen, um das Standardverhalten (Superverhalten) aufzurufen:
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)
}
}
}
Jetzt muss ich nur noch LockableBackgroundTableViewCell
das BackgroundLockable
Protokoll in einer Zellklasse unterordnen oder verwenden, um einigen Zellen auf einfache Weise ein Sperrverhalten hinzuzufügen!
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]
}
}