Цвет тени UIView не меняется
У меня есть UIView
и я установил shadowPath
для этого так:
func addShadow() {
let cornerRadius: CGFloat = self.containerView.frame.height/2
self.containerView.layer.shadowPath = UIBezierPath(roundedRect: self.containerView.frame, cornerRadius: cornerRadius).cgPath
self.containerView.layer.shadowRadius = cornerRadius
self.containerView.layer.shadowOffset = .zero
self.containerView.layer.shadowOpacity = 0.2
self.containerView.layer.cornerRadius = cornerRadius
self.containerView.layer.shadowColor = UIColor(named: "whiteColor")?.cgColor
}
А это whiteColor
:
И теперь моя проблема
Когда я меняю внешний вид телефона,
shadowPath
цвет не меняется автоматически. Что мне делать, чтобы цвет стал динамичным?
3 ответа
Решение
Все свойства слоя не реагируют на изменение цвета автоматически (из-за преобразования в CGColor
).
Вместо этого реагируйте на изменения в коллекции признаков и повторно устанавливайте свойства при изменении внешнего вида цвета:
override open func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13, *), self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
// re-set your properties here
}
}
Вот что сработало для меня - это смесь ответа Frank Schlegel и ответа Курта Ревиса на вопрос cgColor.
override open func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
if #available(iOS 13, *), self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
SubmissionOptionsMenu.layer.shadowColor =
UIColor.label.resolvedColor(with: self.traitCollection).cgColor
}
}
Добавить
self.view.layoutIfNeeded()
в вашей функции.Это может решить вашу проблему. В качестве альтернативы вы добавите цвет вviewDidLayoutSubviews
.