当前位置: > > > Swift - 继承UIView重写draw方法后背景变黑色的问题解决

Swift - 继承UIView重写draw方法后背景变黑色的问题解决

通常我们会继承 UIView 来实现一些自定义的组建。如果需要在上面进行绘图操作的话,可以通过重写 draw 方法来实现。比如下面样例,在组件内部绘制一个空心矩形。
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let frame = CGRect(x: 30, y: 30, width: 250, height: 100)
        let cgView = CGView(frame: frame)
        self.view.addSubview(cgView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

class CGView:UIView {
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        
        //获取绘图上下文
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        
        //创建一个矩形,它的所有边都内缩10点
        let drawingRect = self.bounds.insetBy(dx: 10, dy: 10)
        
        //创建并设置路径
        let path = CGMutablePath()
        path.addRect(drawingRect)
        context.addPath(path)
        
        //设置笔触颜色
        context.setStrokeColor(UIColor.orange.cgColor)
        //设置笔触宽度
        context.setLineWidth(6)

        //绘制路径并填充
        context.strokePath()
    }
}

但我们将其添加到主视图中会发现,背景色(即除了绘制区域外所有地方)变成黑色的。
有两种方式解决这个问题。


1,使用这个自定义视图的时候将背景色设为透明

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let frame = CGRect(x: 30, y: 30, width: 250, height: 100)
        let cgView = CGView(frame: frame)
        cgView.backgroundColor = UIColor.clear
        self.view.addSubview(cgView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
可以发现背景变成透明的了:

2,在自定义视图的init()方法中将背景色设为透明

class CGView:UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        //设置背景色为透明,否则是黑色背景
        self.backgroundColor = UIColor.clear
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        
        //获取绘图上下文
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        
        //创建一个矩形,它的所有边都内缩10点
        let drawingRect = self.bounds.insetBy(dx: 10, dy: 10)
        
        //创建并设置路径
        let path = CGMutablePath()
        path.addRect(drawingRect)
        context.addPath(path)
        
        //设置笔触颜色
        context.setStrokeColor(UIColor.orange.cgColor)
        //设置笔触宽度
        context.setLineWidth(6)

        //绘制路径并填充
        context.strokePath()
    }
}
评论0