Вам нужно сделать некоторую договоренность, чтобы получать уведомления при изменении коллекции признаков, чтобы вы могли сделать слой перерисовывающим свой цвет границы. Это не произойдет само по себе, и willDisplayHeaderView
не будет вызываться магически снова только потому, что режим изменился.
Вот простой iOS проект, демонстрирующий CALayer, который слышит, когда черта коллекция изменилась и соответственно изменила свой цвет границы:
class MyLayer : CALayer {
override init(layer: Any) {
super.init(layer:layer)
}
override init() {
super.init()
self.borderColor = UIColor(named: "MyCoolColor")!.cgColor
NotificationCenter.default.addObserver(self, selector: #selector(changed), name: Notification.Name(rawValue: "traitCollectionDidChange"), object: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func changed(_:Notification) {
self.borderColor = UIColor(named: "MyCoolColor")!.cgColor
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let layer = MyLayer()
layer.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
layer.borderWidth = 5
self.view.layer.addSublayer(layer)
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
NotificationCenter.default.post(name: Notification.Name(rawValue: "traitCollectionDidChange"), object: self)
}
}
}