如何为已设置圆角的View添加阴影效果
你当前代码中设置的clipsToBounds = true会裁剪掉视图图层边界外的所有内容,而阴影默认绘制在边界外部,因此直接添加阴影配置会无法显示,以下是两种可行的实现方案:
方案1:单视图实现(适用于视图内容不会超出圆角边界的场景,如纯色背景视图)
无需调整视图层级,直接修改原有配置即可:
// 保留圆角设置,需将 clipsToBounds 改为 false,否则阴影会被裁剪 self.newView.layer.cornerRadius = 5.0 self.newView.clipsToBounds = false // 阴影相关配置,参数可按需调整 self.newView.layer.shadowColor = UIColor.black.cgColor self.newView.layer.shadowOpacity = 0.3 // 阴影透明度,取值范围0~1 self.newView.layer.shadowOffset = CGSize(width: 0, height: 2) // 阴影偏移,x正方向向右,y正方向向下 self.newView.layer.shadowRadius = 4 // 阴影模糊半径,数值越大阴影越柔和 // 可选配置:手动指定阴影路径,避免运行时动态计算造成的性能损耗 self.newView.layer.shadowPath = UIBezierPath(roundedRect: self.newView.bounds, cornerRadius: 5.0).cgPath
注意:如果视图内部有超出圆角边界的内容,该方案会导致超出部分无法被裁剪,推荐使用方案2
方案2:嵌套视图实现(全场景适用,同时保证圆角裁剪和阴影显示)
通过两层视图实现,外层容器视图负责渲染阴影,内层子视图负责圆角裁剪内容:
// 1. 创建外层容器视图,负责显示阴影 let shadowContainer = UIView(frame: self.newView.frame) shadowContainer.clipsToBounds = false shadowContainer.layer.shadowColor = UIColor.black.cgColor shadowContainer.layer.shadowOpacity = 0.3 shadowContainer.layer.shadowOffset = CGSize(width: 0, height: 2) shadowContainer.layer.shadowRadius = 4 shadowContainer.layer.shadowPath = UIBezierPath(roundedRect: shadowContainer.bounds, cornerRadius: 5.0).cgPath self.view.addSubview(shadowContainer) // 2. 原有视图作为子视图添加到容器,负责圆角裁剪内容 self.newView.layer.cornerRadius = 5.0 self.newView.clipsToBounds = true self.newView.frame = shadowContainer.bounds // 配置自适应规则,容器尺寸变化时子视图同步调整 self.newView.autoresizingMask = [.flexibleWidth, .flexibleHeight] shadowContainer.addSubview(self.newView)
内容的提问来源于stack exchange,提问作者Anita
相关产品推荐
相关产品推荐

