iOS开发UI篇—Quartz2D使用(矩阵操作)
一、关于矩阵操作
1.画一个四边形
通过设置两个端点(长和宽)来完成一个四边形的绘制。
代码:
1 - (void)drawRect:(CGRect)rect 2 { 3 //画四边形 4 //获取图形上下文 5 CGContextRef ctx=UIGraphicsGetCurrentContext(); 6 //绘图 7 CGContextAddRect(ctx, CGRectMake(20, 50, 100, 100)); 8 //渲染 9 CGContextStrokePath(ctx); 10 }
说明:通过这种方式画矩形有弱点:画出来的矩形永远都是正的。如下图:
2.画一个歪的四边形
如何画一个歪的矩形?(通过矩阵操作来完成,和形变操作相似)
可以通过矩阵操作,把画出来的东西进行形变(旋转,缩放,平移)
方法:CGContextRotateCTM(<#CGContextRef c#>, <#CGFloat angle#>)该接受两个参数(图形上下文,弧度)
注意点:设置矩阵操作必须要在添加图形之前,如果设置在添加图形之后的话,此时它已经画完了,无效。
代码:
1 - (void)drawRect:(CGRect)rect 2 { 3 //画四边形 4 //获取图形上下文 5 CGContextRef ctx=UIGraphicsGetCurrentContext(); 6 //矩阵操作 7 //注意点:设置矩阵操作必须要在添加绘图信息之前 8 //旋转45度 9 CGContextRotateCTM(ctx, M_PI_4); 10 11 //绘图 12 CGContextAddRect(ctx, CGRectMake(150, 100, 100, 100)); 13 //渲染 14 CGContextStrokePath(ctx); 15 }
效果:
二、关于旋转
1.旋转演示
view之所以能够显示视图,是因为它的上面有layer,将来图形也是渲染到layer上面。
且,旋转的时候是整个layer都旋转了,可以再画一个圆进行验证。
代码1(未旋转):
1 - (void)drawRect:(CGRect)rect 2 { 3 //获取图形上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //矩阵操作 6 //注意点:设置矩阵操作必须要在添加绘图信息之前 7 //旋转45度 8 // CGContextRotateCTM(ctx, M_PI_4); 9 10 //绘图 11 //画四边形 12 CGContextAddRect(ctx, CGRectMake(150, 100, 100, 100)); 13 //画一个圆 14 CGContextAddEllipseInRect(ctx, CGRectMake(200, 200, 50, 50)); 15 //渲染 16 CGContextStrokePath(ctx); 17 }
效果:
代码2(旋转):
1 - (void)drawRect:(CGRect)rect 2 { 3 //获取图形上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //矩阵操作 6 //注意点:设置矩阵操作必须要在添加绘图信息之前 7 //旋转45度 8 CGContextRotateCTM(ctx, M_PI_4); 9 10 //绘图 11 //画四边形 12 CGContextAddRect(ctx, CGRectMake(150, 100, 100, 100)); 13 //画一个圆 14 CGContextAddEllipseInRect(ctx, CGRectMake(200, 200, 50, 50)); 15 //渲染 16 CGContextStrokePath(ctx); 17 }
效果:
2.关于旋转的补充说明
提示:旋转的时候,是整个layer都旋转了。
三、缩放
方法:CGContextScaleCTM(<#CGContextRef c#>, <#CGFloat sx#>, <#CGFloat sy#>)
该方法接收三个参数(图形上下文,x方向的缩放比例,y方向上的缩放比例
代码示例:
1 - (void)drawRect:(CGRect)rect 2 { 3 //获取图形上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //矩阵操作 6 //注意点:设置矩阵操作必须要在添加绘图信息之前 7 //缩放,x方向缩放0.5倍,y方向缩放1.5倍 8 CGContextScaleCTM(ctx, 0.5, 1.5); 9 10 //绘图 11 //画四边形 12 CGContextAddRect(ctx, CGRectMake(150, 100, 100, 100)); 13 //画一个圆 14 CGContextAddEllipseInRect(ctx, CGRectMake(200, 200, 50, 50)); 15 //渲染 16 CGContextStrokePath(ctx); 17 }
效果:
四、平移
方法: CGContextTranslateCTM(<#CGContextRef c#>, <#CGFloat tx#>, <#CGFloat ty#>)
该方法接收三个参数(图形上下文,x方向的偏移量,y方向上的偏移量)
代码示例:
1 - (void)drawRect:(CGRect)rect 2 { 3 //获取图形上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //矩阵操作 6 //注意点:设置矩阵操作必须要在添加绘图信息之前 7 //平移,x方向移动50,y方向移动100 8 CGContextTranslateCTM(ctx, 50, 100); 9 10 //绘图 11 //画四边形 12 CGContextAddRect(ctx, CGRectMake(150, 100, 100, 100)); 13 //画一个圆 14 CGContextAddEllipseInRect(ctx, CGRectMake(200, 200, 50, 50)); 15 //渲染 16 CGContextStrokePath(ctx); 17 }
效果:
提示:坐标原点为view的左上角。
iOS开发UI篇—Quartz2D使用(矩阵操作)相关推荐
- iOS开发UI篇—Quartz2D使用(绘图路径)
iOS开发UI篇-Quartz2D使用(绘图路径) 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径 cgmutablepat ...
- iOS开发UI篇—Quartz2D简单使用(二)
iOS开发UI篇-Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...
- iOS开发UI篇—Quartz2D使用(信纸条纹)
iOS开发UI篇-Quartz2D使用(信纸条纹) 一.前导程序 新建一个项目,在主控制器文件中实现以下几行代码,就能轻松的完成图片在视图中的平铺. 1 #import "YYViewCon ...
- iOS开发UI篇—Quartz2D使用(绘制基本图形)
一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 决定绘制的输出目标(绘制到什么地方去?)(输出目标可以 ...
- android tableview实现多选功能,iOS开发UI篇-tableView在编辑状态下的批量操作(多选)...
先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...
- iOS开发UI篇—实现UITableview控件数据刷新
iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...
- iOS开发UI篇—CALayer简介
iOS开发UI篇-CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UI ...
- iOS开发UI篇—UITableview控件基本使用
iOS开发UI篇-UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) 1 #import <Foundation/Foundation.h&g ...
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
iOS开发UI篇-使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 iOS开发UI篇-使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目 ...
最新文章
- C和C++安全编码笔记:格式化输出
- QIIME 2教程. 26为QIIME 2开发新插件DevelopingPlugin(2020.11)
- android 9.0室内定位方案,Android GPS室内定位问题的解决方法(location为null)
- Mysql SQL查询今天、昨天、n天内、第n天(执行效率不高)
- java之通过FileChannel实现文件复制
- 为什么要使用信道复用技术?常用的信道复用技术有哪些?
- Kubernetes-命名空间namespace(ns)(十四)
- 这可不是一般的便宜哦!
- 设计师交流社区,让你的原创设计作品展示给世界
- 离线电脑搭建开发环境
- Machine Learning - XVII. Large Scale Machine Learning大规模机器学习 (Week 10)
- php resize函数,Php Image Resize图片大小调整的函数代码
- SPSS多重响应分析(多选题)【SPSS 016期】
- 经济基础知识(中级)【6】
- js打印时分页,每页都有表头和表尾
- 文本分类上分利器: Bert微调trick大全
- Android开发-自定义View-AndroidStudio(二)遇到问题,附:ScrollView中文API
- 高通QCM6125的LK部分(uefi/xbl)编译
- 北京烤鸭+腊肉炒花菜+香椿炒蛋
- 我的世界rpg服务器无限点卷无限金币地址,我的世界RPG插件无限刷任何物品 | 手游网游页游攻略大全...
热门文章
- 计算机专业跨考学科英语难吗,跨考学科英语,过来人走过的弯路
- web 端 gantt组件选型
- excel如何做出弧形_人民日报同款海报,只用线和字就能做出高大上的工作报告...
- 网页编辑PHP变量,编辑文件中的php代码和变量
- centos7.2编译php,CentOS7.2编译安装PHP7.2.3之史上最详细步骤。
- 计算机三级之嵌入式系统学习笔记4
- RabbitMQ服务的安装与使用
- Python中的lambda表达式与filter函数
- IDEA隐藏不需要的文件
- vue 调用webservice_调用webService的几种方式