iOS 进阶 第十二天(0413)
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)的更多相关文章
- iOS 进阶 第二十二天(0603)
0603 block\运行时 block block的本质是一个指向结构体的指针. 运行时 要分析clang命令反编译出来的c++代码,就要把一些小括号删掉来分析.因为这些小括号一般都是类型强转. o ...
- iOS进阶_地图上定位的标志——大头针
一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...
- iOS进阶指南试读之UI篇
iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...
- iOS进阶读物
不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃.啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了, ...
- iOS进阶推荐的书目
<Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法>([英]Matt Galloway) 很多面试题有涉及 <IOS数据库应用高级编 ...
- iOS进阶路线以及进阶书籍
第一,熟悉ARC机制:首先要了解ARC的前世今生.假设了解不清楚会导致两种可能,1,一个对象的引用莫名奇异为空.或失效了.这个一般都能在开发阶段及时发现,由于会导致应用异常.2.导致内存溢出:不了解A ...
- iOS进阶之多线程
多线程 注意:iOS关于UI的刷新和添加必须在主线程中操作! pthread的创建方法: pthread_t pthread; //第一个参数 线程指针 //第二个参数 线程的一些属性 //第三个参数 ...
- iOS进阶_三方使用步骤
一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...
- iOS进阶面试题----Block部分
1 什么是block 对于闭包 (block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解.对于刚接触Block的同学,会觉得有些绕, 因为我们习惯写这样的程 ...
随机推荐
- hdu 4411 最小费用流
思路:主要就是要把一个每个城市拆为两个点,建一条容量为1,费用为-inf的边,保证每个城市都会被遍历. /*最小费用最大流*/ #include<iostream> #include< ...
- Convolution and Deconvolution
1.Introduction 2.Convolution 3.Deconvolution 4.Summary
- MongoDB - MongoDB CRUD Operations, Query Documents, Project Fields to Return from Query
By default, queries in MongoDB return all fields in matching documents. To limit the amount of data ...
- 学习Slim Framework for PHP v3 ( 二)
昨天说到能够成功将本地的URL通过在index.php 中添加get(pattern,clouser)路由到指定的处理类中,处理后(这里指存入数据库中),然后返回response在浏览器中显示. 昨天 ...
- MyFragment
手机横竖屏自动切换不同的View: Landscape-Horizontal-横屏 Portrait-Vertical-竖屏 package com.example.shad_fnst.myfragm ...
- 五、PackageManager获取版本号
PackageInfo代表的是关于一个包的所有信息,就相当于一个APP应用的清单文件中收集到的所有信息. 通过这个类我们就可以获取类似版本号等一些信息. 1 2 3 4 5 6 7 8 9 10 11 ...
- MSI安装程序在Win8/Win10及以上系统中DLL安装问题
报的错误是: There is a problem with this Windows Installer package. A DLL required for this install to co ...
- javascript之面向对象程序设计(对象和继承)
总结的文章略长,慎点. 知识点预热 引用类型:引用类型的值(对象)是引用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起.在其他面向对象语言中被称为类,虽然 ...
- Android开发代码规范
目录 1.命名基本原则 2.命名基本规范 2.1编程基本命名规范 2.2分类命名规范 3.分类命名规范 3.1基本数据类型命名规范 3.2控件命名规范 3.3变量命名规范 3.4整个项目的目录规范化 ...
- 【NPOI】.NET EXCEL导入导出开发包
1.导出 //工作簿HSSFWorkbook HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //ISheet页 ISheet sheet1 = hss ...