关于iOS图形上下文环境(CGContext)的操作

2017-11-02 by dangyalingengjia

CGContext是Quartz2D的描画环境,包括了描画参数以及将图渲染到目标页面上需要的所有设备相关的信息,目标页面可能是应用窗口,位图,PDF文档或者打印机。
每个图形上下文环境环境包含一个图形状态栈。

基本知识

图一:CG坐标系跟UI坐标系

图二:层的position和anchorPoint

接口函数

创建一个基于位图的图形环境作为当前环境:等价于(UIGraphicsBeginImageContextWithOptions(size, false, 1))func UIGraphicsBeginImageContext(_ size: CGSize)通过参数创建给予位图的图形环境:opaque:是否不透明scale:缩放比例func UIGraphicsBeginImageContextWithOptions(_ size: CGSize, _ opaque: Bool, _ scale: CGFloat)

关键是缩放因子scale的指定,将scale指定为0,意味着将其设定为设备屏幕的缩放因子

保存除path之外的图形元素:func saveGState()在上下文环境中改变用户坐标系的原点func translateBy(x tx: CGFloat, y ty: CGFloat)用指定矩阵对用户坐标系进行变换 CTMnew = transform * CTMcontext.func concatenate(_ transform: CGAffineTransform)

使用举例

1,做如下变换后可以得到与UI坐标一样的图形

// 顺时针旋转180度context.rotate(by: CGFloat(M_PI))// 沿X轴对称处理context.scaleBy(x: -1, y: 1)// 把偏移掉的位置调整回来context.translateBy(x: 0, y: CGFloat(-iv.image!.size.height))

上面三步操作用图形示意如下。注意旋转的是坐标系而不是图片本身。

2,在对图形做变换时,为了保证变换后图形的中心位置不变,需要做以下处理:

// 将CG坐标原点从layer的左下角移动至layer的中心context.translateBy(x: self.layer.position.x, y: self.layer.position.y)// 进行移动、旋转、反转等变换context.concatenate(self.transform)// 将CG坐标原点移回至layer左下角,变换完成context.translateBy(x: -self.bounds.size.width * self.layer.anchorPoint.x, y: -self.bounds.size.height * self.layer.anchorPoint.y)

第七城市

栏目导航(关闭)