为父视图设置阴影时,如何指定子视图bView不继承阴影?
解决方案:让指定子视图不受父视图阴影影响
问题根源
你给superView添加了阴影,但未设置它的背景色,导致superView的layer会根据所有子视图的合并不透明区域生成阴影路径——这就是aView和bView都带上阴影的原因。bView.clipsToBounds = true仅负责裁剪bView自身的子视图,无法影响父视图的阴影计算逻辑,所以不会生效。
两种可行解决办法
办法1:给bView套个“遮阴影”的容器
给bView添加一个父容器,容器背景色与bView保持一致,同时将容器的阴影透明度设为0,用它挡住superView在bView区域的阴影:
let superView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)) superView.layer.shadowColor = UIColor.lightGray.cgColor superView.layer.shadowOffset = CGSize(width: 0, height: 3) superView.layer.shadowOpacity = 0.2 superView.layer.shadowRadius = 5 self.view.addSubview(superView) let aView: UIView = UIView(frame: CGRect(x: 10, y: 100, width: 100, height: 100)) aView.backgroundColor = .white superView.addSubview(aView) // 新增bView的容器 let bContainer = UIView(frame: CGRect(x: 10, y: 230, width: 100, height: 100)) bContainer.backgroundColor = .white bContainer.layer.shadowOpacity = 0 // 抵消父视图阴影影响 superView.addSubview(bContainer) let bView: UIView = UIView(frame: bContainer.bounds) bView.backgroundColor = .white bContainer.addSubview(bView)
办法2:手动指定superView的阴影路径
直接给superView.layer.shadowPath赋值,仅包含需要带阴影的子视图区域(比如这里的aView),这样bView区域就不会生成阴影:
let superView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)) superView.layer.shadowColor = UIColor.lightGray.cgColor superView.layer.shadowOffset = CGSize(width: 0, height: 3) superView.layer.shadowOpacity = 0.2 superView.layer.shadowRadius = 5 self.view.addSubview(superView) let aView: UIView = UIView(frame: CGRect(x: 10, y: 100, width: 100, height: 100)) aView.backgroundColor = .white superView.addSubview(aView) let bView: UIView = UIView(frame: CGRect(x: 10, y: 230, width: 100, height: 100)) bView.backgroundColor = .white superView.addSubview(bView) // 仅为aView区域生成阴影 let shadowPath = UIBezierPath(rect: aView.frame) superView.layer.shadowPath = shadowPath.cgPath
注意事项
- 办法2需要留意:如果
aView的位置或尺寸发生变化,需要重新更新shadowPath;如果有多个需要带阴影的子视图,可以将它们的路径合并后再赋值。
内容的提问来源于stack exchange,提问作者MorganChen
相关产品推荐
相关产品推荐

