当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的更多相关文章

  1. iOS 图形处理 Core Graphics Quartz2D 教程

    Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘图.变换.颜色管理.脱屏 ...

  2. iOS使用Core Graphics和UIBezierPath绘画

    通过UIView的子类的- (void)drawRect:(CGRect)rect 函数可用对视图进行重新绘画: 要重新绘画可以通过Core Graphics和UIBezierPath来实现. 1.通 ...

  3. 在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. ...

  4. Core Graphics框架

    在iOS中常用的框架是Quartz 2D,它是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.我们日常开发所用到的UIKit的组件都是由Core Graphics框架进行绘制的. ...

  5. iOS绘图UIBezierPath 和 Core Graphics框架

    前言 iOS系统本身提供了两套绘图的框架,即UIBezierPath 和 Core Graphics.而前者所属UIKit,其实是对Core Graphics框架关于path的进一步封装,所以使用起来 ...

  6. Cocoa Touch(三):图形界面UIKit、Core Animation、Core Graphics

    UIKit 视图树模型 1.视图树模型 计算机图形实际上是一个视图树模型,每个视图都有一个本地坐标系.每个本地坐标系的组成部分是:原点在父坐标系中的位置,每个基在父坐标系中的位置,由此就可以根据向量的 ...

  7. iOS圆角view的Swift实现(利用Core Graphics绘制)

    iOS圆角view的Swift实现(利用Core Graphics绘制) 因为app的列表用用到了圆形图片的头像,所以去探究并思考了一下这个问题.首先这个问题有两个方向的解决方案: 把图片弄成圆形的. ...

  8. iOS绘图—— UIBezierPath 和 Core Graphics

    前言 iOS系统本身提供了两套绘图的框架,即UIBezierPath 和 Core Graphics.而前者所属UIKit,其实是对Core Graphics框架关于path的进一步封装,所以使用起来 ...

  9. iOS绘图系统UIKit与Core Graphics

    概述 iOS主要的绘图系统有UIKit,Core Graphics,Core Animation,Core Image,Open GL等,本片博文主要介绍UIKit与Core Graphics的绘图系 ...

随机推荐

  1. 关于Android配色 自适应颜色的实现

    在Android4.4系统中,更加详细地介绍了关于颜色的细节并提供了使用colour的新教程,以使我们的应用更加独一无二.也就是说,作为一个设计师或者开发者,为你的APP做完美的配色已经变成了你的职责 ...

  2. javascript (四) 改变html样式

    <h1 id="domo"> this is testing test</h1> <script> function changecolor() ...

  3. Delphi引用C对象文件

    C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...

  4. 大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心

    大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心   大白菜U盘启动制作工具装机维护版V5.0

  5. linux串口编程总结

    串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...

  6. 虚幻4随笔4 从project開始

     前文说到UE3開始.虚幻就使用了UnrealBuildTool(下面简称UBT)来编译和生成代码. 为什么这么做而不是使用VS是非常好理解的:由于VS跨平台会比較麻烦.像虚幻这样体量的proje ...

  7. ThinkPHP框架模型连贯操作(八)

    原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...

  8. JAVA NIO 选择器

    为什么要使用选择器 通道处于就绪状态后,就可以在缓冲区之间传送数据.可以采用非阻塞模式来检查通道是否就绪,但非阻塞模式还会做别的任务,当有多个通道同时存在时,很难将检查通道是否就绪与其他任务剥离开来, ...

  9. 基于模糊Choquet积分的目标检测算法

    本文根据论文:Fuzzy Integral for Moving Object Detection-FUZZ-IEEE_2008的内容及自己的理解而成,如果想了解更多细节,请参考原文.在背景建模中,我 ...

  10. <Win32_17>集音频和视频播放功能于一身的简易播放器

    前段时间,在学习中科院杨老师的教学视频时,他说了一句话: "我很反对百八十行的教学程序,要来就来一个完整的程序" 对此,我很是赞同.所谓真刀真枪的做了,你才会发现其中的奥秘——然而 ...