swift UIView阴影不使用自定义扩展

aydmsdu9  于 2023-03-22  发布在  Swift
关注(0)|答案(6)|浏览(157)

我正在尝试使用为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)

但是阴影并没有出现在视图上
我已经用其他类型的视图测试了这个扩展,比如按钮和标签,阴影工作得很好。
有人知道是什么原因导致了这个问题吗?任何帮助都将不胜感激。提前谢谢你

w1e3prcc

w1e3prcc1#

此问题可能是由addShadow函数中的layer.masksToBounds = true行引起的。此属性将层的子层裁剪到层的边界,这可能会阻止显示阴影。
你可以尝试将masksToBounds设置为false,然后再将阴影添加到图层中。

2g32fytz

2g32fytz2#

通过设置layer.masksToBounds = true,您可以告诉视图的层剪切任何超出其边界的内容,这将包括您试图添加的阴影。

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 }
// remove this line: layer.masksToBounds = true

如果这不起作用,您可能需要尝试将视图的backgroundColor属性更改为非半透明的颜色。如果没有要渲染的内容,则不会看到阴影,因为阴影是通过显示层的内容产生的。

f0brbegy

f0brbegy3#

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

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

ktca8awb4#

如果我们使用clipsToBounds = true,它将剪切帧,并且阴影被切断,只需将该行替换为clipsToBounds = false即可修复它。

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

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

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

}

f0brbegy

f0brbegy5#

我在阴影方面也有同样的困难。我已经用这个扩展解决了。试试看。

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

    }
}
shstlldc

shstlldc6#

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

layer.masksToBounds = false

相关问题