当前位置: > > > Swift - Core Graphics绘图框架详解4(绘制图片、图形变换)

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()
    }
}
评论0