You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为已设置圆角的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 13:39:01