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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:57:02