core graphics path

当UIKit无法满足绘图需求的时候,就需要用到Core Graphics API,其中最普遍的就是path。一些重要的概念

graphics context

可以理解成canvas,在ios里对应CGContextRef类型,拿到它的方法是调用这个函数:

UIGraphicsGetCurrentContext()

graphics context有很多种,可以分别将图形绘制到bitmap,PDF,UIView里。最常见的当然就是往UIView里绘制,做法就是覆盖UIView的drawRect:方法,然后调用上面这个函数,就得到了针对UIView的graphics context。由于初始化的工作UIKit已经完成了,所以开发者可以立刻绘制图形,不需要额外配置

标准的quartz 2D,context的坐标系原点在左下角。但是UIKit已经自动转换了,原点移到了左上角,与UIView的坐标系保持一致

graphics state

保存绘制参数,比如线条的粗细,颜色,样式等等,完整的参数列表可以看apple的官方文档。graphics state是一个stack数据结构,可以用以下函数执行push和pop的操作:

CGContextSaveGState()
CGContextRestoreGState()

如果不需要暂存state状态后面继续使用的话,可以直接调用CGContextSetXXX函数,即时设置状态,比如:

CGContextSetLineWidth()
CGContextSetStrokeColorWithColor()

path的2段式绘制

绘制path分2个阶段,分别是path创建和path绘图

创建path用到的函数有很多,比如addLineToPoint,addRect,addArc等,这些函数只是创建了path和它的subpaths,并不会实际画到graphics context上

创建path之后,需要调用fill和stroke函数,把当前的path画出来,绘制的函数包括:

CGContextStrokePath()
CGContextFillPath()
CGContextDrawPath()

strokePath和fillPath都属于fluent function,如果需要同时stroke和fill,那么应该调用第三个函数,然后将绘制mode设置为既stroke又fill

初学者一个常见的问题是,创建了一段path之后,先调用strokePath(),再调用fillPath(),为什么fill没有生效。因为无论是fill还是stroke,调用之后都flash了缓冲区,之前已经绘制好的path就结束了,所以后调用的函数就不会生效。正确的方法是调用drawPath

一次只能绘制一个path

创建path一般是从调用这个函数开始:

CGContextBeginPath()

调用这个函数,标识着开始创建一个path。但是如果只有一个path,或者paint之后再次创建path,其实这个函数也不需要调用。一般这个函数是和CGPathRef配合使用的,只有需要暂存一个path,后续继续使用的场景下,才需要调用这个函数

但是需要了解“一次只能绘制一个path”这个概念,比如下面的代码:

CGContextMoveToPoint(context, 100, 100);
CGContextAddLineToPoint(context, 200, 100);

CGContextBeginPath();

CGContextMoveToPoint(context, 100, 200);
CGContextAddLineToPoint(context, 200, 200);

CGContextStrokePath(context);

先创建了一个path,然后又创建了第2个path,最后调用stroke方法。只有第2个path会被画出来,因为graphics context每次只会画出“当前的”path。上面的代码,第一个path永远也绘制不出来,等于是丢失了

subpath

但是这并不意味着path不能绘制复杂的图形,因为一个path可以包含任意subpath。调用fillPath,strokePath,beginPath函数,都会开始一个新的path。但是在调用之前,可以添加任意个subpath,比如addLineToPoint,addRect等函数,都会添加subpath到当前的path中,下一次paint的时候,会把所有的subpath都画出来

path闭合

graphics context会始终维护一个current point,创建path的第一步,就需要调用

CGContextMoveToPoint()

这样context就获得了第一个当前点,然后当调用addLineToPoint时,current point就会自动移动,从而绘制出连续的线条。如果想要画不连续的线条,就再次调用CGContextMoveToPoint,改变current point的位置。这个方法创建的是subpath,不会创建新的path

创建若干line之后,可以调用CGContextClosePath,创建出一个封闭的区域,对后续的stroke和fill都有效

抗锯齿

调用下面的2个函数,可以设置绘制的图形有抗锯齿效果:

CGContextSetShouldAntialias(context, YES);
CGContextSetAllowsAntialiasing(context, YES);

core graphics path

时间: 2024-08-30 07:36:17

core graphics path的相关文章

Core Graphics快速入门——从一行代码说起

Core Graphics入门 想必每个第一次接触Core Graphics的开发者都被无数的API.混乱的代码逻辑折腾得头疼不已,甚至望而却步.即使是绘制一个简单的矩形也看上去非常繁琐.本文换一个角度,整理一下有关Core Graphics的知识,也算作是这段时间学习的总结. Core Graphics和UIKit的区别 首先从概念上了解一下: 根据苹果的描述,UIKit是我们最容易也是最常接触到的框架.绝大多数图形界面都由UIKit完成.但是UIKit依赖于Core Graphics框架,也

iOS使用Core Graphics和UIBezierPath绘画

通过UIView的子类的- (void)drawRect:(CGRect)rect 函数可用对视图进行重新绘画: 要重新绘画可以通过Core Graphics和UIBezierPath来实现. 1.通过Core Graphics函数来绘画 首先要通过UIGraphicsGetCurrentContex()函数获取当前绘画上下文: 然后设定起点,增加线到一个点,,,,,闭合,例如下面: //获取当前绘画上下文 CGContextRef context= UIGraphicsGetCurrentCo

Swift Core Graphics教程之Gradients 与 Context

原文链接 : Core Graphics Tutorial Part 2: Gradients and Contexts 原文作者 : caroline 译文出自 : 开发技术前线 译者 : HarriesChen 校对者: HarriesChen 更新时间 04/15/2015 为Xcode 6.3 和 Swift1.2更新 欢迎回到我们的Swift核心绘图教程系列! 在第一部分中,你学习到了使用storyboard绘制线条和矩形. 在第二部部分中,你将深入核心绘图,使用CGContext实现

在drawRect:方法中绘制图片,文字以及Core Graphics 框架的了解

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }

媒体层:Core Graphics(绘图)

1.简介: 基于C的API,用于绘图, 当使用UIKit来创建按钮.图像或者其他UIView的子类时,UIKit会使用Core Graphics来将这些元素绘制在屏幕上 可创建直线.路径.渐变.文字.图像等内容 CGContextRef:图像上下文.画布 从UIView的子类中获取它的当前上下文UIGraphicsGetCurrentContext(),然后重写drawRect方法 绘图动作是顺序的,每个动作都是在前一个动作的基础上面完成的 只要iOS任务一个视图需要被刷新或者重绘drawRec

iOS绘图—— UIBezierPath 和 Core Graphics

前言 iOS系统本身提供了两套绘图的框架,即UIBezierPath 和 Core Graphics.而前者所属UIKit,其实是对Core Graphics框架关于path的进一步封装,所以使用起来比较简单.但是毕竟Core Graphics更接近底层,所以它更加强大. UIBezierPath 可以创建基于矢量的路径,例如椭圆或者矩形,或者有多个直线和曲线段组成的形状. 使用UIBezierPath,你只能在当前上下文中绘图,所以如果你当前处于UIGraphicsBeginImageCont

IOS开发——Core Graphics & Core Animation

好久没写过blog了,首先了解下最近苹果和IOS方面的最新消息. 1.WWDC2014在上个月举行了,与2013年一样,今年WWDC没发布硬件产品和新品(如果你懂cook你就会期待今年秋季发布会,预计10中旬举行) 今年WWDC有一个最令人兴奋的新语言发布--Swift,小编也花了将近半个月来学习新语言,发现Swift与反人类语言objective-c不同的是完全抛弃了C,更像是js+lua+python+各种脚本语言的集合,这也是时间上最新最先进的开发语言,小道消息说swift今年4岁,也就是

UIKit,Core Data , Core Graphics, Core Animation,和OpenGLES框架

iOS的主要框架介绍 框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它.许多应用程序都使用了如Foundation.UIKit.和Core Graphics这些框架.根据你为应用程序选择的模版,相关的框架就已经被自动引入了.如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架. 看

Core Graphics 学习——1 两张图合成为一张图

-(UIImage *)MergeTwoImage { UIImage * img =[UIImage imageNamed:@"icon"]; CGSize sz = img.size; UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width*2, sz.height), NO, 0); [img drawAtPoint:CGPointMake(0, 0)]; [img drawAtPoint:CGPointMake(sz