You need to enable JavaScript to run this app. Swift中为自定义DrawView添加背景图后矩形绘制失效如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Swift中为自定义DrawView添加背景图后矩形绘制失效如何解决

问题原因

你将UIImageView作为DrawView的子视图添加,即使调用了sendSubviewToBack,子视图的渲染层级依然高于父视图自身通过draw(_ rect:)绘制的内容,导致绘制的矩形被背景图遮挡,和UIGraphicsGetCurrentContext的使用没有关系。

修复方案

以下两种实现方案按需选择即可:

方案1:直接在draw方法内绘制背景图(推荐,层级逻辑最简单)

调整绘制顺序,先画背景图再画矩形,无需额外添加子视图:

class DrawView: UIView {
    var startPos: CGPoint?
    var endPos: CGPoint?
    // 新增背景图属性
    var backgroundImage: UIImage?
    
    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        // 优先绘制背景图
        if let bgImage = backgroundImage {
            bgImage.draw(in: bounds)
        }
        // 再绘制矩形
        if let startPos = startPos, let endPos = endPos {
            drawRectangle(context: context, startPoint: startPos, endPoint: endPos, isFilled: false)
        }
    }
    
    // 原有drawRectangle、触摸相关方法保留不变
    // 可删除原来的addBackground方法
}

// ViewController 调用修改
class ViewController: UIViewController {
    @IBOutlet weak var drawView: DrawView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        drawView.backgroundImage = UIImage(named: "img1.jpg")
    }
}

方案2:调整视图层级,背景图与DrawView平级

把背景图放在DrawView的下层,DrawView设置透明背景,让绘制内容直接显示在背景图上方:

class ViewController: UIViewController {
    @IBOutlet weak var drawView: DrawView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 背景图添加到Controller的view上,放在DrawView下层
        let imageView = UIImageView(frame: drawView.bounds)
        imageView.image = UIImage(named: "img1.jpg")
        imageView.contentMode = .scaleAspectFill
        view.insertSubview(imageView, belowSubview: drawView)
        // DrawView设置透明背景
        drawView.backgroundColor = .clear
    }
}
额外优化点

你现有代码的drawRectangle方法中有一行冗余代码:context.addLine(to: xx),刚执行完context.move(to: xx)就添加一条到同一点的线,没有实际作用,可以直接删除。

内容的提问来源于stack exchange,提问作者Kingalione

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:12:04