如何设置 CALayer 的阴影会破坏 AutoLayout 约束?
Posted
技术标签:
【中文标题】如何设置 CALayer 的阴影会破坏 AutoLayout 约束?【英文标题】:How setting up shadow of the CALayer breaks AutoLayout constraints? 【发布时间】:2020-04-27 08:28:39 【问题描述】:我有单元格的 imageView 阴影自定义:
override func layoutSubviews()
moviePosterImageView.layer.shadowOffset = .zero
moviePosterImageView.layer.shadowColor = UIColor.black.cgColor
moviePosterImageView.layer.shadowRadius = 5
moviePosterImageView.layer.shadowOpacity = 1
moviePosterImageView.layer.masksToBounds = false
moviePosterImageView.layer.shadowPath = UIBezierPath(rect: moviePosterImageView.bounds).cgPath
但它破坏了 imageView 的大小和约束。没有阴影效果很好。
【问题讨论】:
【参考方案1】:但它破坏了 imageView 的大小和约束。
是的,因为你忘了说开始
override func layoutSubviews()
super.layoutSubviews() // important
由于自动布局发生在layoutSubviews
,如果你不调用super
,你会阻止它运行。
【讨论】:
我叫了 super 但还是一样 我通过将 imageView 包装到容器中解决了我的问题(仅查看)【参考方案2】:在另一个 swift 文件中使用此代码并在故事板或 xib 中轻松设置阴影
extension UIView
@IBInspectable
var cornerRadius: CGFloat
get
return layer.cornerRadius
set
layer.cornerRadius = newValue
@IBInspectable
var borderWidth: CGFloat
get
return layer.borderWidth
set
layer.borderWidth = newValue
@IBInspectable
var borderColor: UIColor?
get
if let color = layer.borderColor
return UIColor(cgColor: color)
return nil
set
if let color = newValue
layer.borderColor = color.cgColor
else
layer.borderColor = nil
@IBInspectable
var shadowRadius: CGFloat
get
return layer.shadowRadius
set
layer.shadowRadius = newValue
@IBInspectable
var shadowOpacity: Float
get
return layer.shadowOpacity
set
layer.shadowOpacity = newValue
@IBInspectable
var shadowOffset: CGSize
get
return layer.shadowOffset
set
layer.shadowOffset = newValue
@IBInspectable
var shadowColor: UIColor?
get
if let color = layer.shadowColor
return UIColor(cgColor: color)
return nil
set
if let color = newValue
layer.shadowColor = color.cgColor
else
layer.shadowColor = nil
【讨论】:
以上是关于如何设置 CALayer 的阴影会破坏 AutoLayout 约束?的主要内容,如果未能解决你的问题,请参考以下文章