iOS core graphic使用分析

core graphics 提供了描绘图形的底层库。

使用Core Graphics可以:

  • 创建基于路径的绘图
  • 抗锯齿渲染
  • 添加梯度、图片和颜色
  • Use coordinate-space transformations.
  • 创建、显示和分析PDF文档
下面就作者在项目中使用到的core graphics做一个总结:

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.圆形头像


实现圆形头像效果的代码如下:


这段代码怎样理解呢?请看

•UIGraphicsBeginImageContext

创建一个基于位图的图片上下文,并把它当作当前上下文

UIGraphicsGetCurrentContext

•返回当前的图片上下文(也就是取得这个图片上下文的引用)默认的当前图片上下文是nil。在调用drawRect之前,view对象将一个有效的上下文推入stack,并把它当作当前。如果你没有使用UIView对象来绘画,你就必须使用UIGraphicsPushContext,手动将一个有效的上下文推入stack。

•CGAffineTransformConcat

通过将两个仿射变换综合在一起,返回一个仿射变换矩阵

CGAffineTransformMakeScale

通过提供的缩放值,返回一个仿射变换矩阵

CGAffineTransformIdentity

单位变换


•CGContextBeginPath
•在graphiccontext中创建一个新的空的path。

•CGContextAddEllipseInRect
•添加一个椭圆,该椭圆可以适应指定的矩形。

•CGContextClip
•使用非零绕数规则来计算当前path和当前clippingpath的相交区域。
•非零绕数规矩,假如一个点被从左到右跨过,计数器+1,从右到左跨过,计数器-1,最后,若是成果是0,那么不填充,若是长短零,那么填充

2.在一个图形周围画上一个边框


实现边框效果的代码如下:


•因为没有调用drawInRect,所以调用UIGraphicsPushContext来设定一个context
•UIBezierPath addClip让UIBezierPath的path和当前graphiccontext相交,并让结果变成currentclipping path。


•让image画在区域里drawInRect
•CGRectInset返回一个扩大的矩形,[expandedPath addClip]并且返回一个




3.给图片添加阴影(shadow)


实现shadow效果的代码如下:

CALayer的下面属性会影响layer的阴影显示:shadowColorshadowOffsetshadowOpacityshadowRadius  

 


绘画阴影步骤 ///

先画基本的一条横线,一条竖线。



再画一条曲线


最后画一条竖线,封闭成一个阴影的形状



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值