如何为UIImage添加投影效果而非给UIImageView添加投影
解决方案核心思路
UIImage本质是位图数据对象,要给它本身添加投影,需要将投影效果直接渲染到位图中,生成包含投影的新UIImage对象,这样投影会成为图像本身的一部分,和承载的视图无关。
具体实现代码
可以通过扩展UIImage实现通用的加投影方法,Swift 示例代码如下:
extension UIImage { func addShadow(shadowColor: UIColor = .gray, shadowOffset: CGSize = CGSize(width: 0, height: 1), shadowOpacity: Float = 1, shadowRadius: CGFloat = 1.0) -> UIImage? { // 计算包含投影的画布总尺寸,避免投影被裁剪 let totalWidth = size.width + abs(shadowOffset.width) + shadowRadius * 2 let totalHeight = size.height + abs(shadowOffset.height) + shadowRadius * 2 let renderer = UIGraphicsImageRenderer(size: CGSize(width: totalWidth, height: totalHeight)) return renderer.image { context in let cgContext = context.cgContext // 给上下文设置投影属性 cgContext.setShadow(offset: shadowOffset, blur: shadowRadius, color: shadowColor.withAlphaComponent(CGFloat(shadowOpacity)).cgColor) // 计算原始图像的绘制位置,预留投影展示空间 let originX = shadowRadius + max(0, -shadowOffset.width) let originY = shadowRadius + max(0, -shadowOffset.height) draw(at: CGPoint(x: originX, y: originY)) } } }
使用方法
调用上述扩展方法生成带投影的新UIImage即可:
let originalImage = UIImage(named: "你的图片资源名") let shadowedImage = originalImage?.addShadow() // 直接赋值给UIImageView即可,不需要再对ImageView设置layer阴影属性 imageView.image = shadowedImage
注意事项
- 你之前贴的UIImageView加阴影的代码存在错误:
imageView.layer.masksToBounds = true会裁剪掉layer边界外的内容,导致阴影无法显示,需要改为false才能正常展示UIImageView的layer阴影。 - 本方案生成的UIImage已经内置投影,不需要再对UIImageView做任何阴影相关配置,就算设置
masksToBounds = true也不会裁掉投影。
内容的提问来源于stack exchange,提问作者Natasha
相关产品推荐
相关产品推荐

