core graphics 提供了描绘图形的底层库。
使用Core Graphics可以:
- 创建基于路径的绘图
- 抗锯齿渲染
- 添加梯度、图片和颜色
- Use coordinate-space transformations.
- 创建、显示和分析PDF文档
core graphics基本概念
对于应用类框架其实没有太多的原理性东西好讲,基本上都可以开门见山地讲解使用方法,并且在使用过程中加深理解。如果是在要理解原理,可以记下以下这些概念。
1.core graphics最需要理解,同时也是最基本的模型就是,绘图都是在一个叫做位图上下文(bitmap context)的结构体上进行的,这个就好比是一个画布,画之前需要创建这个画布。
UIGraphicsBeginImageContext
创建一个基于位图的图片上下文,并把它当作当前上下文
UIGraphicsGetCurrentContext
返回当前的图片上下文(也就是取得这个图片上下文的引用)
默认的当前图片上下文是nil。在调用drawRect之前,view对象将一个有效的上下文推入stack,并把它当作当前。如果你没有使用UIView对象来绘画,你就必须 使用UIGraphicsPushContext,手动将一个有效的上下文推入stack。
2.这个画布是一个栈结构,当你想在目前画图基础上,再继续绘画,但又想保存之前的图片状态,不被改变,就需要保存图片状态。
UIGraphicsPushContext
指定特定的图片上下文为当前的上下文
你可以使用这个方法来保存之前图片状态,并且指定特定的context为当前context。你必须使用UIGraphicsPopContext来平衡调用。
CGContextSaveGState
为指定context,将当前graphic状态的一份拷贝推入graphic state stack中。
每一个graphic context都维持一个graphic states的stack。需要注意的是,不是所有的当前绘画环境都是graphic state元素。比如。current path就不是graphic state个一部分,因而不能被保存,当你调用CGContextSaveGState
3.规则图形,例如点,直线,矩形,椭圆都可以用core graphics提供的基本接口实现,但是要画不规则图形就要用到贝兹曲线;贝兹曲线(bezier curve)是用来和图片上下文(graphic context)一起确定,图片形状的,尤其是不规则形状。
UIBezierPath
addClip
使由receiver path所封闭的区域(也就是UIBezierPath所封闭的area)与当前graphic context的剪裁path相交,并将结果产生的形状当作当前clipping path。
这个方法可以修改当前graphic context的绘图区域。如果你不需要clipping region了,可以使用CGContextRestoreGState还原回前一个绘画状态。
具体的使用方法可以参考apple 的官方文档
core graphic在实际项目中的使用
1.圆形头像
实现圆形头像效果的代码如下:
这段代码怎样理解呢?请看
创建一个基于位图的图片上下文,并把它当作当前上下文
UIGraphicsGetCurrentContext
通过将两个仿射变换综合在一起,返回一个仿射变换矩阵
CGAffineTransformMakeScale
通过提供的缩放值,返回一个仿射变换矩阵
CGAffineTransformIdentity
单位变换
2.在一个图形周围画上一个边框
实现边框效果的代码如下:
3.给图片添加阴影(shadow)
实现shadow效果的代码如下:
CALayer的下面属性会影响layer的阴影显示:shadowColor,shadowOffset,shadowOpacity,shadowRadius
绘画阴影步骤 ///
先画基本的一条横线,一条竖线。
再画一条曲线
最后画一条竖线,封闭成一个阴影的形状