如何设置 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 约束?的主要内容,如果未能解决你的问题,请参考以下文章

UIView:如何用阴影为 CALayer 框架设置动画?

iOS核心笔记——CALayer-基本使用

让CALayer的shadowPath跟随bounds一起做动画改变-b

仅将 CALayer 阴影遮蔽到矩形之外

使用 CALayer 的 UIView 没有出现阴影

iOS同时设置圆角和阴影含部分圆角