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. uva 12284 直接判断

    思路:见代码 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm ...

  2. CSS3笔记

    CSS/CSS3在线手册:http://www.css119.com/book/css/   CSS3实现水平垂直居中:http://bbs.html5cn.org/thread-87300-1-1. ...

  3. 面对一个“丢失了与用户“签订”的协议的修改”时进行的思考。

    对于上图中的gauge,将value与label之间的比例值调整了,调整为1:1.2.这意味着,在新系统中打开老报表,老报表中的这个gauge的value可能会比以前大,二者可能是用户厌恶的效果. 严 ...

  4. JSON介绍与JavaScript解析

    首先什么是JSON? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 JSON ...

  5. 安装ie10慢的解决办法

    下面是win7安装ie10的先决条件: http://support.microsoft.com/kb/2818833

  6. cocos2dx-lua之断点调试支持

    cocos2dx 3.2版对cocos code ide支持已经相当棒了,不过话说,编辑器用起来感觉没有sublime顺手 支持cocos code ide已经支持创建lua项目了,可是默认创建的项目 ...

  7. 配置Hibernate二级缓存步骤

    配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...

  8. 济南学习 Day2 T2 am

    [问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有

  9. 使用 CocoStudio UI 编辑器实现《乱斗堂》设置界面

    由于是引用别人的,所以直接贴上地址了.http://www.cocoachina.com/bbs/read.php?tid=164820&fpage=7 1 游戏中必不可少的 UI 元素    ...

  10. 十个最常见的Java字符串问题

    翻译自:Top 10 questions of Java Strings 1.怎样比较字符串?用”==”还是用equals()? 简单地说,”==”测试两个字符串的引用是否相同,equals()测试两 ...