Swift - Core Graphics绘图框架详解4(绘制图片、图形变换)
一、绘制图像
Core Graphics 也是支持绘制图片图像的,而且 UIKit 中对这个做了封装,方便我们使用。
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)
self.view.addSubview(cgView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
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)
//获取图像
let image = UIImage(named: "image1.jpg")
//绘制到指定的矩形中(大小不合适会自动进行拉伸)
image?.draw(in: self.bounds)
}
}
2,从指定点开始绘制
这种方式图片尺寸大小、比例都不变,如果显示区域不够的话就会显示不全。
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)
//获取图像
let image = UIImage(named: "image1.jpg")
//从指定点开始绘制
image?.draw(at: CGPoint(x: 0, y: 0))
}
}
二、变换(Transform)的使用
我们除了可以通过对视图 View 进行变换,实现平移旋转缩放操作外。对于绘图上下文,也是可以进行变换的。

(1)上面样例我们对绘图上下文做平移、缩放、旋转变换操作后,对接下来的所有绘图操作都会起作用。这里是使用图像作为演示,如果绘制其它图形同理。
(2)在对绘图上下文进行变换前我们可以先把当前默认状态保存下来,这样绘图完毕后可以还原回去。方便后续操作。
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
}
//保存初始状态
context.saveGState()
//变换1:向左向下本别平移10点
context.translateBy(x: 10, y: 10)
//变换2:缩放成0.1
context.scaleBy(x: 0.1, y: 0.1)
//变换3:旋转10度
context.rotate(by: CGFloat.pi/18)
//获取图像
let image = UIImage(named: "image1.jpg")
//从指定点开始绘制
image?.draw(at: CGPoint(x: 0, y: 0))
//恢复成初始状态
context.restoreGState()
}
}
