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
相关产品推荐
相关产品推荐

