1

我有一个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的颜色不会自动改变。我应该怎么做才能使颜色动态?

4

3 回答 3

12

所有图层属性不会自动对颜色变化做出反应(由于转换为CGColor)。

相反,当颜色外观发生变化时,对特征集合的变化做出反应并重新设置属性:

override open func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    if #available(iOS 13, *), self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
        // re-set your properties here
    }
}
于 2019-09-25T07:10:45.457 回答
1

所以这对我有用 - 这是Frank Schlegel的回答和 Kurt Revis对 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
   }
}
于 2019-11-14T02:10:54.633 回答
0

添加 self.view.layoutIfNeeded() 您的功能。它可能会解决您的问题。以另一种方式,您将在viewDidLayoutSubviews.

于 2019-09-25T07:20:28.407 回答