标签:core graphics quartz 2d path ios
当UIKit无法满足绘图需求的时候,就需要用到Core Graphics API,其中最普遍的就是path。一些重要的概念
可以理解成canvas,在ios里对应CGContextRef类型,拿到它的方法是调用这个函数:
UIGraphicsGetCurrentContext()
标准的quartz 2D,context的坐标系原点在左下角。但是UIKit已经自动转换了,原点移到了左上角,与UIView的坐标系保持一致
保存绘制参数,比如线条的粗细,颜色,样式等等,完整的参数列表可以看apple的官方文档。graphics state是一个stack数据结构,可以用以下函数执行push和pop的操作:
CGContextSaveGState() CGContextRestoreGState()
CGContextSetLineWidth() CGContextSetStrokeColorWithColor()
绘制path分2个阶段,分别是path创建和path绘图
创建path用到的函数有很多,比如addLineToPoint,addRect,addArc等,这些函数只是创建了path和它的subpaths,并不会实际画到graphics context上
创建path之后,需要调用fill和stroke函数,把当前的path画出来,绘制的函数包括:
CGContextStrokePath() CGContextFillPath() CGContextDrawPath()
初学者一个常见的问题是,创建了一段path之后,先调用strokePath(),再调用fillPath(),为什么fill没有生效。因为无论是fill还是stroke,调用之后都flash了缓冲区,之前已经绘制好的path就结束了,所以后调用的函数就不会生效。正确的方法是调用drawPath
创建path一般是从调用这个函数开始:
CGContextBeginPath()
但是需要了解“一次只能绘制一个path”这个概念,比如下面的代码:
CGContextMoveToPoint(context, 100, 100); CGContextAddLineToPoint(context, 200, 100); CGContextBeginPath(); CGContextMoveToPoint(context, 100, 200); CGContextAddLineToPoint(context, 200, 200); CGContextStrokePath(context);
但是这并不意味着path不能绘制复杂的图形,因为一个path可以包含任意subpath。调用fillPath,strokePath,beginPath函数,都会开始一个新的path。但是在调用之前,可以添加任意个subpath,比如addLineToPoint,addRect等函数,都会添加subpath到当前的path中,下一次paint的时候,会把所有的subpath都画出来
graphics context会始终维护一个current point,创建path的第一步,就需要调用
CGContextMoveToPoint()
创建若干line之后,可以调用CGContextClosePath,创建出一个封闭的区域,对后续的stroke和fill都有效
调用下面的2个函数,可以设置绘制的图形有抗锯齿效果:
CGContextSetShouldAntialias(context, YES); CGContextSetAllowsAntialiasing(context, YES);
core graphics path,布布扣,bubuko.com
标签:core graphics quartz 2d path ios
原文地址:http://blog.csdn.net/kyfxbl/article/details/37737243