我正在尝试使用我为 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 的问题。
有谁知道可能导致此问题的原因是什么?任何帮助将不胜感激。提前谢谢你
问题可能是addShadow函数中的layer.masksToBounds = true这一行引起的。此属性将图层的子图层剪裁到图层的边界,这可能会阻止显示阴影。
您可以尝试在将阴影添加到图层之前将 masksToBounds 设置为 false
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
}
}
您可以尝试添加 UIBezierPath 并设置 shouldRasterize = true。
layer.shadowPath = UIBezierPath(rect: yourView.bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
layer.masksToBounds 应该为 false 以禁用图层的蒙版以显示视图边界外的阴影。
layer.masksToBounds = false