Swift如何在UITableView行中为蒙版裁剪的圆形图片添加阴影
问题原因
CALayer的mask属性会裁切所有超出蒙版路径范围的内容,而阴影默认绘制在layer本体边界外部,因此添加圆形蒙版后阴影也会被同步裁剪,这就是你注释mask后阴影恢复的原因。同时你把layer配置逻辑放在draw(_ rect:)方法中也不合理,该方法每次视图重绘都会触发,重复配置layer会造成不必要的性能开销。
解决方案
采用「两层视图拆分」的方案即可同时实现圆形裁切和阴影效果:
- 外层的容器View仅作为阴影承载层,不设置mask,仅配置阴影属性,显式指定阴影路径为圆形避免性能损耗
- 内层的UIImageView单独设置圆形裁切,负责展示圆形图片,不会影响外层的阴影绘制
修正后的代码示例
class CircleShadowView: UIView { // 内部承载图片的UIImageView let imageView: UIImageView = { let imgView = UIImageView() imgView.contentMode = .scaleAspectFill imgView.clipsToBounds = true return imgView }() override init(frame: CGRect) { super.init(frame: frame) setupUI() } required init?(coder: NSCoder) { super.init(coder: coder) setupUI() } override func layoutSubviews() { super.layoutSubviews() // 适配视图尺寸变化,动态更新圆角和阴影路径 let circleRadius = bounds.width / 2 imageView.layer.cornerRadius = circleRadius // 显式指定阴影路径为圆形,大幅提升UITableView滚动性能 layer.shadowPath = UIBezierPath(ovalIn: bounds).cgPath } private func setupUI() { // 添加内部ImageView addSubview(imageView) imageView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ imageView.topAnchor.constraint(equalTo: topAnchor), imageView.leadingAnchor.constraint(equalTo: leadingAnchor), imageView.trailingAnchor.constraint(equalTo: trailingAnchor), imageView.bottomAnchor.constraint(equalTo: bottomAnchor) ]) // 配置外层阴影 layer.shadowColor = UIColor.black.cgColor layer.shadowOpacity = 0.5 layer.shadowOffset = .init(width: 10, height: -10) layer.shadowRadius = 2 // 外层不要开启clipsToBounds,保证阴影可以正常显示 clipsToBounds = false } }
使用说明
你在自定义TableViewCell中直接使用CircleShadowView替代原来的drawView,将需要展示的图片赋值给它的imageView属性即可,无需额外配置即可同时得到圆形图片和对应的圆形阴影,且显式设置了shadowPath不会影响UITableView的滚动流畅度。
内容的提问来源于stack exchange,提问作者dsplatonov
相关产品推荐
相关产品推荐

