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()
}
}
