iOSQuartz2D-01-使用技巧

简介


  • 作用

    • 绘制

      • 绘制图形 : 线条\三角形\矩形\圆\弧等
      • 绘制文字
      • 绘制\生成图片(图像)
      • 读取\生成PDF
      • 截图\裁剪图片
    • 自定义UI控件(通常为内部结构较复杂的控件)
      • UIKit中的绝大部分控件都是由系统绘制的
    • 矩阵操作(使绘制到图形啥下文中的所有路径都发生变化)
      • 缩放
      • 旋转
      • 平移
  • 简介
    • Quartz2D隶属于Core Graphic框架,是一个二维的绘图引擎,直接操于Layer(图层),通常在-drawRect:方法中获取上下文,将需要绘制的内容绘制到图形上下文中,然后将图层渲染到控件,最后关闭图形上下文。
    • - (void)drawRect:(CGRect)rect,该方法只会界面即将显示的时候调用一次,若要在此调用需要调用重绘方法- (void)setNeedsDisplay

常用的绘制操作


  • 绘制直线(三种方法)

    • 通过添加路径的方式绘制直线,最后把路径渲染的上下文

      • 开启上下文
      • CGContextRef context = UIGraphicsGetCurrentContext()
      • 描述所要绘制的路径
      • 创建路径

        CGMutablePathRef CGPathCreateMutable(void)

      • 设置起点

        void CGPathMoveToPoint(CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y)

      • 连线

        void CGPathAddLineToPoint(CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y)

      • 将路径添加到上下文
      • void CGContextAddPath(CGContextRef context, CGPathRef path)
      • 渲染上下文
      • void CGContextStrokePath(CGContextRef c)
    • 直接在上下文中绘制直线
      • 开启上下文
      • CGContextRef context = UIGraphicsGetCurrentContext()
      • 描述所要绘制的路径
      • 设置起点

        void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)

      • 连线

        void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)

      • 渲染上下文
      • void CGContextStrokePath(CGContextRef c)
    • 通过贝瑟尔绘制直线
      • 常见贝瑟尔路径(最普通的路径)
      • (UIBezierPath *)bezierPath
      • 设置起点
      • (void)moveToPoint:(CGPoint)point
      • 连线
      • (void)addLineToPoint:(CGPoint)point
      • 渲染
      • (void)stroke
  • 绘制曲线
    • 获取上下文

      • CGContextRef UIGraphicsGetCurrentContext(void)
    • 绘制路径
      • 设置起点

        void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)

      • 连线

        void CGContextAddQuadCurveToPoint(CGContextRef c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)

    • 渲染上下文

      void CGContextStrokePath(CGContextRef c)

  • 绘制圆弧(通过贝瑟尔路径)
    • 创建贝瑟尔路径

      • + (UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
      • - (void)stroke
  • 绘制饼状图
    • 思路:

      1) 饼状图其实是在圆弧的基础上增加了两条线而完成

    • 实现步骤
      • 通过贝瑟尔路径绘制圆弧
      • + (UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
      • 添加直线使路径封闭
      • 从路径终点到圆弧圆心添加直线
        • - (void)addLineToPoint:(CGPoint)point
      • 路径起点到圆弧圆心的直线会被自动添加

        调用- (void)fill方法是自动添加

      • 设置填充颜色
      • - (void)set,此方法是UIColor对象的方法,用于设置上下文填充或渲染的颜色
      • 填充并封闭路径并渲染
      • - (void)fill,通过贝瑟尔路径调用该方法
  • 绘制柱状图
    • 思路

      1) 通过贝瑟尔路径可以直接绘制柱状图

    • 实现步骤
      • 创建贝瑟尔路径
      • + (UIBezierPath *)bezierPathWithRect:(CGRect)rect
      • 设置填充颜色
      • - (void)set,此方法是UIColor对象的方法,用于设置上下文中填充或渲染的颜色
      • 填充并封闭路径并渲染
      • - (void)fill
  • 绘制文字
    • 思路

      • NSString的分类NSStringDrawing实现了将NSString对象的绘制方法
      • - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs,从某个点开始绘制文字
      • - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs,在rect区域内绘制文字
      • 在绘制文字是,还可以通过attrs参数设置其属性
    • 实现步骤
      • 创建NSString对象
      • 设置文本属性(其属性不存在一个字典中,通过指定的key去设置相应的属性)
      • 设置文本颜色

        NSForegroundColorAttributeName

      • 设置字体

        NSFontAttributeName

      • 设置渲染时的宽度

        NSStrokeWidthAttributeName

      • 设置渲染时的颜色

        NSStrokeColorAttributeName

      • 设置背景属性

        NSShadowAttributeName

        设置背景颜色:shadowColor(UIColor)

        模糊属性:shadowBlurRadius(CGFloat)

        偏移量:shadowOffset

      • 绘制文字
      • - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs
      • - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs,若使用该方法,则文字会单行显示
  • 绘制图片
    • 思路

      直接调用UIImage的用于绘制的对象方法即可绘制

    • 实现步骤
      • 创建UIImage对象
      • 创建绘制区域
      • 设置超出绘制区域的内容被剪掉

        UIRectClip(CGRect rect)

      • 绘制图片
      • - (void)drawAsPatternInRect:(CGRect)rect,平铺的方式显示图片,铺满整个绘制区域(rect)
      • - (void)drawAtPoint:(CGPoint)point,显示一张与原来图片大小一样的图片
      • - (void)drawInRect:(CGRect)rect,图片被拉伸,大小等于rect
      • - (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha

    本博客的最新状态将会同步到新浪微博账号:世俗孤岛

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 19:27:05

iOSQuartz2D-01-使用技巧的相关文章

架构师速成6.6-知识的收集整理学习

知识如何学习前面已经讲了2节,这节主要讲知识的整理和沉淀. 其实我之前也一直没有好好的思考过这个问题,今天在整理自己的wiz知识库的时候突发灵感,所以有了这一节. 其实知识获取的过程分为搜索->收集->整理->精化->应用->分享,前一部分跟时间管理的收集也很相近吧.知识获取的思路适用于有目的的知识收集和日常的备忘性的知识收集.当然你随机收集一些资料记录下来其实效果并不是很理想,重要的是你要有目的的学习才能最大的发挥你的心智以及潜意识.当你主动要学习一项知识时,你的潜意识会主

我喜欢减肥我们来减肥吧

http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313278016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313282016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313289016/2015.01.28.html http://www.ebay.com/cln/usli

百度回家看沙发沙发是减肥了卡斯加积分卡拉是减肥

http://www.ebay.com/cln/hpryu-caw8ke/cars/158056866019/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445650015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445674015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/1584456790

巢哑偕倥乇椭煞谙暗逞帕俸

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

我国第三代移动通信研究开发进展-尤肖虎200106

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

pl/sql学习1——标量变量psahnh6S

为类型.不能用于表列的数据类型.范围为的子类型.自然数.为的子类型.具有约束为单精度浮点数.为变量赋值时.后面要加为双精度浮点数.为变量赋值时.后面要加.为数字总位数.为小数位数是的子类型.最大精度位是的子类型.最大精度位单精度浮点型是的子类型.最大精度位双精度浮点型定义精度为位的实数..定义为位的整数.变长字符串.最长测试变量数据!.定长字符串.最长测试变长二进制字符串物理存储的为类型...固定长度.个字节使用定义数据类型那个最小值:最大值:最小值:最大值:最小值:最大值:最小值:最大值:最小

给你一个云端的大脑01:印象笔记小技巧

我在上课时,很多学员们给我的反馈都是:老师你讲的太精彩啦,但我记不住.我最重视的就是学员的反馈,因为我是一个完美主义者,凡事既然做就要做到最好.而学员就像我的一面镜子,反馈是我改进的方向. 很久以前,我听到这样的反馈第一反应就是自己还是讲得不够好,但后来我的讲课都能hold住全场300多人的时候,我发现这个反馈仍然频繁出现,这不是我的问题而是学员们不会学习的问题,这样的学员在工作中也是缺乏自我培养的能力. 所以从今天起,我的平台又加入一个主题:给你一个云端的大脑.告诉你如何记笔记,如何整理大脑记

Cocos2d-x 游戏发布攻防篇01:防止打包党的小技巧

其实这方面的心得我倒是没有多少,也没什么高深的心得,只不过我曾经有4.5个游戏被打包过而已(小若:赤裸裸地炫耀你的失败). 虽然我这文章标题写着"攻防篇01",但不代表就一定有"攻防篇02",只是,随意取的.(小若:敢负责任一点吗?) 这里科普一下,什么叫做打包党. 打包党是一种职业,一种不光彩的职业,他们专门去下载别人的游戏安装包,反编译,然后加入自己的广告,最后重新打包上传到各个市场,从而谋取收益. 别小看他们,部分打包党过得比我们还要滋润. 什么?你心动了?你

转载_【译】Android Studio使用技巧系列之快捷键01

转自:[译]Android Studio使用技巧系列之快捷键01 打开类/文件/符号 打开类 1 2 mac: cmd + o win/linux: ctrl + n 假设你要打开快速切换到如MainActivity.java的类,可以使用该快捷键然后输入MainA… 打开文件 1 2 mac: cmd + shift + o win/linux: ctrl + shift + n 和打开类相似,但是该快捷键可以打开工程目录下的任意文件.这可以快速帮你打开如AndroidManifest.xml

Hadoop技巧(01):插件,终端权限

阅读目录 序 HDFS权限 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 在hadoop开发或者使用中,可能会使用到一些插件或3方软件,比如:Eclipse的Hadoop插件,ETL的Kettle.那么就存在一个hdfs目录权限的问题. 下面就这个权限问题进行阐述. HDFS权限 一:目录结构 Hadoop文件系统HDFS的用户为hdfs,默认密码为空.HDFS根目录下还有一个