UIView 阴影不适用于自定义扩展

问题描述 投票:0回答:4

我正在尝试使用我为 UIView 类创建的自定义扩展为我的 UIView 添加阴影。这是扩展代码:

extension UIView {
    func round(_ radius : CGFloat = 10) {
        layer.cornerRadius = radius
        clipsToBounds = true
    }

    func addBorder(color: UIColor, width: CGFloat) {
        layer.borderColor = color.cgColor
        layer.borderWidth = width
    }

    func addShadow(opacity: Float, size: Double, radius: Double, color: UIColor ) {
        layer.shadowColor = color.cgColor
        layer.shadowOpacity = opacity
        layer.shadowOffset = CGSize(width: size, height: size)
        layer.shadowRadius = radius
        layer.masksToBounds = true
    }
}

round 和 addBorder 函数工作得很好,但是 addShadow 函数似乎不起作用。我试过像这样在 UIView 实例上调用函数:

let myView = UIView()
myView.addShadow(opacity: 0.5, size: 2, radius: 4, color: .black)

但是阴影并没有出现在视图中

我已经用其他类型的视图测试了这个扩展,比如按钮和标签,阴影效果非常好。这似乎只是 UIViews 的问题。

有谁知道可能导致此问题的原因是什么?任何帮助将不胜感激。提前谢谢你

ios swift user-interface uiview uikit
4个回答
2
投票

问题可能是addShadow函数中的layer.masksToBounds = true这一行引起的。此属性将图层的子图层剪裁到图层的边界,这可能会阻止显示阴影。

您可以尝试在将阴影添加到图层之前将 masksToBounds 设置为 false


1
投票

yasir 我对阴影有同样的困难。我已经用这个扩展解决了它。试试吧。

extension UIView {
    /// show drop shadow under view
    /// - Parameter scale: bool variable to enable scaling
    func dropShadow(scale: Bool = true) {
        layer.masksToBounds = false
        layer.shadowColor = UIColor.gray.cgColor
        layer.shadowOpacity = 0.2
        layer.shadowOffset = CGSize.zero
        layer.shadowRadius = 10
        layer.shouldRasterize = true
        layer.rasterizationScale = scale ? UIScreen.main.scale : 1

    }
}

0
投票

您可以尝试添加 UIBezierPath 并设置 shouldRasterize = true。

layer.shadowPath = UIBezierPath(rect: yourView.bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale

0
投票

layer.masksToBounds 应该为 false 以禁用图层的蒙版以显示视图边界外的阴影。

layer.masksToBounds = false
© www.soinside.com 2019 - 2024. All rights reserved.