如果设置角半径,则不应用阴影

Posted

技术标签:

【中文标题】如果设置角半径,则不应用阴影【英文标题】:Shadow not being applied if setting corner radius 【发布时间】:2017-07-17 17:48:35 【问题描述】:

我正在尝试将角半径添加到bottmLeft 和bottomRight 角,并为其添加阴影。但是由于某种原因,如果我添加那些圆角半径,阴影就会消失。这是什么原因造成的?

这就是我的工作:

我有分机:

extension UIView 
    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) 
        self.layoutIfNeeded()
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    

应用角:

myView.roundCorners([.bottomLeft, .bottomRight], radius: 35)

添加阴影扩展:

func addShadow(offset: CGSize, color: UIColor, radius: CGFloat, opacity: Float) 
    let layer = self.layer
    layer.masksToBounds = false
    layer.shadowOffset = offset
    layer.shadowColor = color.cgColor
    layer.shadowRadius = radius
    layer.shadowOpacity = opacity
    layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath

    let backgroundCGColor = self.backgroundColor?.cgColor
    self.backgroundColor = nil
    layer.backgroundColor =  backgroundCGColor

并添加阴影:

myView.addShadow(offset: CGSize.init(width: 0.0, height: 10.0) , color: UIColor.blue, radius: 35.0, opacity: 1.0)

为什么添加圆角后阴影消失了?

【问题讨论】:

尝试添加self.clipsToBounds = false 【参考方案1】:

myView.layer.shadowPath 需要使用 UIBezierPath 进行初始化。只需给它与 myView 相同的框架和边界即可。

【讨论】:

以上是关于如果设置角半径,则不应用阴影的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIBezierPath 将半径设置为某些角并向自定义 UIButton 添加阴影

使用 UIBezierPath 为带有阴影的选定边缘添加角半径 | iOS |斯威夫特 4.2

在带有阴影的 LinearLayout 上获取角半径

UIVIew 角半径和阴影?

具有角半径的 WPF 插入阴影

具有角半径和阴影的 SWIFT UITableViewCell