0413 - Quartz2D

使用Quartz2D画图形步骤:(drawRect: 方法 是 在view第一次显示到屏幕上的时候会调用一次.是系统主动去掉用的,不能直接调用.那么问题来了,比如我要通过滑块持续移动界面上画出的一个圆的位置怎么办呢?就要用到了刷帧也叫重绘,可以调用setNeedsDisplay方法,来让系统再次调用drawRect: 方法来达到目的.当然调用setNeedsDisplay是刷新整个界面,也可以通过调用``setNeedsDisplayInRect: 来刷新具体的矩形区域的界面.)

注意 drawRect: 方法在View第一次显示到界面上的时候会调用,这个可以用来做自己UIImageView.如下图

Quartz2D须知:

基本画线代码:


画线段、三角形和矩形方法

1、画三角形 需要一个一个点的画

2、画矩形 非平行四边形 非旋转矩形 有线程的方法直接画.如下图所示:


画圆和弧线

1、画圆,比较简单,就是在一个矩形框内画一个圆.如下图:(也可以通过话圆弧的方式画出来)

2、画圆弧,圆弧必须有圆心、半径,开始角度、结束角度以及是顺时针还是逆时针.如下图所示:

结合画线和画圆弧画1/4圆,如下图:

注意:右侧水平线永远是0度,顺时针度数变大,逆时针度数变小


画文字和图片(纯c的api画出来的都是倒的,咱们只用oc的方法来画,就是正的,并且不用传图形上下文)

1、画文字(使用纯c语言的api默认画出来的文字或图片是反的.因为Quartz2D默认屏幕左下角为(0, 0).那为什么刚才画的线段、圆和圆弧左上角是(0, 0)呢?因为UIKit框架帮我们做了一次坐标系的转换.用oc的方法来画不会倒过来)

  • 用oc的方法画文字.这样就可以自定义一个UITextLabel(也可以换行)

2、画图片(平铺,亦可实现打水印效果)

注意画图片的平铺效果.其实中心点缩放技术最底层的也是调用Quartz2D来实现的


画小黄人

有个用画贝塞尔曲线画小黄人嘴巴,如下图:


图形上下文栈(Quartz2D核心)

重要的两行代码:

Quartz2D图形上下文CGContextRef处理原理

  • 在界面上画单个元素

首先获取当前的图形上下文,设置了一些状态保存在图形上下文中,画线、圆或圆弧都会先在图形上下文栈里面开启一个画布,把要画的线、圆或圆弧画上去.,当调用了CGContextStrokePath(只是一个方法)的时候,图形上下文就会把自己画布上的元素绘制到界面上去.

  • 在界面上画多个多状态的元素

首先获取当前图形上下文,调用CGContextSaveGState将当前获取的图形上下文完完整整的拷贝一份放到图形上下文栈中,待使用.接下来的操作都是在之前的图形上下文中做的操作,已经入栈的图形上下文不会被操作.当调用了CGContextStroke(只是一个方法)的时候系统就会将当前图形上下画布里的内容绘制到界面上.当调用了CGContextRestoreGState的时候,系统会将图形上下文栈中栈顶的图形上下文出栈,替换当前正在操作的图形上下文.此时再画线、圆或圆弧的时候,图形上下文中的状态都是初始状态.这样,利用图形上下文栈就做到了同时画多个不同状态的元素到界面上.

如下图所示:


画折线图、柱状图或者饼形图可以用CorePlot.它已经将Quartz2D封装好了

矩阵操作

这里就是对要画到界面上的元素做矩阵变换,包括平移、旋转和缩放.如下图所示:(这里也体现了图形上下文栈的作用)

你也可以在iOS文档中搜索Quartz2D,找实例代码来学习如下图:(可以做到画虚线各种样式、画五角星、图片处理、渐变色、颜色混合模式甚至查看pdf等等)


使用Quartz2D裁切图片

图片裁切可以使用UIImageView自身的图层layer来做,也可以用画图片然后使用QuartzD来裁切达到目的.不仅可以裁切圆,只要你能画出的形状都是按照你的图形上下文形状来裁切.如下图所示:


刷帧(重绘)setNeedsDisplay

就是重复的去画图形上下文中的元素.

问题:如果持续改变已经绘制到界面上的一个圆的位置或半径大小?

答:比如我要通过滑块持续移动界面上画出的一个圆的位置怎么办呢?就要用到了刷帧也叫重绘,可以调用setNeedsDisplay方法,来让系统再次调用drawRect: 方法来达到目的.当然调用setNeedsDisplay是刷新整个界面,也可以通过调用setNeedsDisplayInRect: 来刷新具体的矩形区域的界面.

在比如在界面上画一个雪花图片不停的下落,此时要用到 drawRect: 画图片 ,然后NSTimer计时器累加距离,最后计时器调用setNeedsDisplay刷帧重绘雪花图片位置达到雪花落下的效果.(这里如要想要刷的很快的话不建议使用NSTimer,建议使用CADisplayLink,它可以一秒刷60次.).如下图所示:


iOS 进阶 第十二天(0413)的更多相关文章

  1. iOS 进阶 第二十二天(0603)

    0603 block\运行时 block block的本质是一个指向结构体的指针. 运行时 要分析clang命令反编译出来的c++代码,就要把一些小括号删掉来分析.因为这些小括号一般都是类型强转. o ...

  2. iOS进阶_地图上定位的标志——大头针

    一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...

  3. iOS进阶指南试读之UI篇

    iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...

  4. iOS进阶读物

    不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃.啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了, ...

  5. iOS进阶推荐的书目

    <Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法>([英]Matt Galloway) 很多面试题有涉及 <IOS数据库应用高级编 ...

  6. iOS进阶路线以及进阶书籍

    第一,熟悉ARC机制:首先要了解ARC的前世今生.假设了解不清楚会导致两种可能,1,一个对象的引用莫名奇异为空.或失效了.这个一般都能在开发阶段及时发现,由于会导致应用异常.2.导致内存溢出:不了解A ...

  7. iOS进阶之多线程

    多线程 注意:iOS关于UI的刷新和添加必须在主线程中操作! pthread的创建方法: pthread_t pthread; //第一个参数 线程指针 //第二个参数 线程的一些属性 //第三个参数 ...

  8. iOS进阶_三方使用步骤

    一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...

  9. iOS进阶面试题----Block部分

    1 什么是block 对于闭包 (block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解.对于刚接触Block的同学,会觉得有些绕, 因为我们习惯写这样的程 ...

随机推荐

  1. 剑指Offer26 字符串的全排列

    /************************************************************************* > File Name: 26_String ...

  2. MVC 菜鸟学习记录1

    Asp.Net MVC 模式是一种表现模式.它将web应用程序分成三个主要组件即:    Model.View.Controller M:Model 主要是存储或者是处理数据的组件 Model其实是实 ...

  3. Page.ClientScript.RegisterStartupScript

    Page.ClientScript.RegisterStartupScript方法最初可用的选项之一就是使用一个可实现此功能的 .NET 类来注册脚本块. 第一个是 RegisterStartupSc ...

  4. 跟我一起玩转FineUI之嵌套表格

    最近一直在研究FineUI(http://www.fineui.com/),那么什么是FineUI呢,FineUI是基于 ExtJS 的专业 ASP.NET 控件库.创建 No JavaScript, ...

  5. [转]Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

  6. IOS显示九宫格列表

    //总列数 ; CGFloat appW = ; CGFloat appH = ; //间隙 CGFloat maginX = (self.view.frame.size.width - totalC ...

  7. Type 'System.IO.FileStream' with data contract name 'FileStream:http://schemas.datacontract.org/2004/07/System.IO' is not expected.

    今天在WCF项目里使用DataContract序列化接口参数的时候,报了这个错,错误详细信息如下: System.ServiceModel.CommunicationException: There ...

  8. 【转】 memwatch使用说明书

    memwatch使用说明书 1.memwatch是什么?    memwatch是C语言的内存检测器.除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能.如果你真的想 ...

  9. 【Linux C中文函数手册】之 目录操作函数

    目录操作函数 1)closedir 关闭目录 相关函数: opendir表头文件: #include<sys/types.h> #include<dirent.h>定义函数: ...

  10. 【学习笔记】【C语言】函数

    一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...