Цвет тени 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.

Другие вопросы по тегам