iOS开发UI篇—Quartz2D使用(绘图路径)

 

1     //1.获取图形上下文
2     CGContextRef ctx=UIGraphicsGetCurrentContext();
3     //2.绘图(画线)
4     //设置起点
5     CGContextMoveToPoint(ctx, 20, 20);
6     //设置终点
7     CGContextAddLineToPoint(ctx, 200, 300);
8     //渲染
9     CGContextStrokePath(ctx);

上面的代码和下面的代码是等价的。

 1     //1.获取图形上下文2     CGContextRef ctx=UIGraphicsGetCurrentContext();3     4     //2.绘图5     //2.1创建一条直线绘图的路径6     //注意:但凡通过Quartz2D中带有creat/copy/retain方法创建出来的值都必须要释放7     CGMutablePathRef path=CGPathCreateMutable();8     //2.2把绘图信息添加到路径里9     CGPathMoveToPoint(path, NULL, 20, 20);
10     CGPathAddLineToPoint(path, NULL, 200, 300);
11     //2.3把路径添加到上下文中
12     //把绘制直线的绘图信息保存到图形上下文中
13     CGContextAddPath(ctx, path);
14     
15     //3.渲染
16     CGContextStrokePath(ctx);
17     
18     //4.释放前面创建的两条路径
19     //第一种方法
20     CGPathRelease(path);
21     //第二种方法
22     //    CFRelease(path);
23 }

B.直接使用path的好处:

第一种代码的阅读性不好,不便于区分。使用path,则一个path就代表一条路径。

比如:如果要在上下文中绘制多个图形,这种情况下建议使用path。

代码示例:

 1 - (void)drawRect:(CGRect)rect2 {3     //1.获取图形上下文4     CGContextRef ctx=UIGraphicsGetCurrentContext();5 6     //2.绘图7     //2.a 画一条直线8     //2.a.1创建一条绘图的路径9     //注意:但凡通过Quartz2D中带有creat/copy/retain方法创建出来的值都必须要释放
10     CGMutablePathRef path=CGPathCreateMutable();
11     
12     //2.a.2把绘图信息添加到路径里
13     CGPathMoveToPoint(path, NULL, 20, 20);
14     CGPathAddLineToPoint(path, NULL, 200, 300);
15     
16     //2.a.3把路径添加到上下文中
17     //把绘制直线的绘图信息保存到图形上下文中
18     CGContextAddPath(ctx, path);
19     
20     
21     //2.b画一个圆
22     //2.b.1创建一条画圆的绘图路径(注意这里是可变的,不是CGPathRef)
23     CGMutablePathRef path1=CGPathCreateMutable();
24     
25     //2.b.2把圆的绘图信息添加到路径里
26     CGPathAddEllipseInRect(path1, NULL, CGRectMake(50, 50, 100, 100));
27     
28     //2.b.3把圆的路径添加到图形上下文中
29     CGContextAddPath(ctx, path1);
30     
31     
32     //3.渲染
33     CGContextStrokePath(ctx);
34     
35     //4.释放前面创建的两条路径
36     //第一种方法
37     CGPathRelease(path);
38     CGPathRelease(path1);
39     //第二种方法
40 //    CFRelease(path);
41 }

效果:

提示:如果是画线,那么就创建一条路径(path)用来保存画线的绘图信息,如果又要重新画一个圆,那么就可以创建一条新的路径来专门保存画圆的绘图信息。

注意:

但凡通过quarzt2d中带有creat/copy/retain方法创建出来的值都必须手动的释放

有两种方法可以释放前面创建的路径:

(1)CGPathRelease(path);

(2)CFRelease(path);

说明:CFRelease属于更底层的cocafoundation框架

二、补充知识点:

画四边形的一些方法:

第一种方式:通过连接固定的点绘制四边形

第二种方式:指定起点和宽高绘制四边形

第三种方式:把第二种方式中的两步合并成一步。

第四种方式(oc的方法):绘制实心的四边形,注意没有空心的方法

第五种:画根线,设置线条的宽度(通过这种方式可以画斜的四边形)

代码示例:

 1 //2 //  YYview.m3 //  06-四边形的五种画法4 //5 //  Created by apple on 14-6-11.6 //  Copyright (c) 2014年 itcase. All rights reserved.7 //8 9 #import "YYview.h"
10 
11 @implementation YYview
12 
13 
14 - (void)drawRect:(CGRect)rect
15 {
16     //获取图形上下文
17     CGContextRef ctx=UIGraphicsGetCurrentContext();
18     //第一种画法,通过连接固定的点绘制四边形
19 //    CGContextMoveToPoint(ctx, 0, 20);
20 //    CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);
21 //    CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);
22 //    CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);
23     
24     //第二种方式:指定起点和宽高绘制四边形
25 //    CGContextAddRect(ctx, CGRectMake(20, 20, 200, 100));
26 //    //渲染
27 //    CGContextStrokePath(ctx);
28     
29     //第三种方式:二种的两步合并成一步。
30     //画空心的四边形
31 //    CGContextStrokeRect(ctx, CGRectMake(20, 20, 200, 100));
32 //    //画实心的四边形
33 //    CGContextFillRect(ctx, CGRectMake(20, 20, 200, 100));
34     
35     //第四种方式(oc的方法):绘制实心的四边形,注意没有空心的方法
36     UIRectFill(CGRectMake(20, 20, 200, 100));
37     
38     //第五种方式:画根线,设置线条的宽度(通过这种方式可以画斜的四边形)
39 //    CGContextMoveToPoint(ctx, 20, 20);
40 //    CGContextAddLineToPoint(ctx, 100, 200);
41 //    CGContextSetLineWidth(ctx, 50);
42 //    //注意,线条只能画成是空心的
43 //    CGContextStrokePath(ctx);
44     
45 }
46 @end

第五种方法可以画斜的四边形。

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/9774825.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.9 bitset

#include<bitset> bitset容器是一个bit位元素的序列容器&#xff0c;每个元素只占一个bit位&#xff0c;取值为0或1&#xff0c;因而很节省内存空间。 bitset<n> b; b.any() 是否有1 b.none() 是否无1 b.count() 1的个数 b.size() 大小 b[pos] 访问 b.…

C# 谈谈Interface和通过Interface传递web页面数据

接口&#xff1a;描述可属于任何类或结构的一组相关功能&#xff0c;通过interface关键字来声明&#xff1b;接口只包含方法、委托或事件和属性的签名&#xff08;接口包含的成员&#xff09;、不能包含字段&#xff08;因为字段是包含数据的&#xff09;。方法的实现是“继承”…

Spring支持如下5种作用域

当通过Spring容器创建一个Bean实例时&#xff0c;不仅可以完成Bean实例的实例化&#xff0c;还可以为Bean指定特定的作用域。Spring支持如下5种作用域&#xff1a; singleton&#xff1a;单例模式&#xff0c;在整个Spring IoC容器中&#xff0c;使用singleton定义的Bean将只有…

RBAC授权

给用户授予RBAC权限没有权限会报如下错误&#xff1a;执行查看资源报错&#xff1a; unable to upgrade connection: Forbidden (userkubernetes, verbcreate, resourcenodes, subresourceproxy)[roottest4 ~]# kubectl exec -it http-test-dm2-6dbd76c7dd-cv9qf sh error: una…

出卷子

http://chujuanzi.com/ 出卷子 涵盖初高中全部学科题库&#xff0c;全国名校试卷最快更新。试卷新、试题全、解析准、完全免费&#xff0c;提供丰富试题辅助教师有效出试卷&#xff0c;组卷方便快捷。&#xff08;高中语文 高中数学 高中英语 高中物理 高中化学 高中生物 高中政…

2.10 stack

#include<stack> 后进先出 Last In First Out LIFO 插入和删除元素只能在表的一端进行。 插入端 栈顶 Stack Top 入栈 Push 删除端 栈底 Stack Bottom 出栈 Pop stack<int> s; s.push(1); //入栈 int i s.top(); //获得栈顶元素 s.pop(); //出栈 s.size…

13结构型模式之桥接模式

概念 Bridge 模式又叫做桥接模式&#xff0c;是构造型的设计模式之一。Bridge模式基于类的最小设计原则&#xff0c;通过使用封装&#xff0c;聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象&#xff08;abstraction&#xff09;与行为实现&#xff08;i…

话说Svn与Git的区别

把第一条理解到位思想到位了做起来才会有的放矢&#xff0c;其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的&#xff0c;而Svn不是分布的。能理解这点&#xff0c;上手会很容易&#xff0c;声明一点Git并不是目前唯一的分布式版本控制系统&#xff0c;还有比如M…

Ubuntu下Postgres安装与配置

postgres8.4安装配置&#xff1a;1.安装postgres8.4~$ sudo apt-get install postgresql 2.修改超级管理员postgres密码&#xff1a;以系统用户运行psql~$ sudo -u postgres psql postgres修改postgres密码(123456)postgres# /password postgres 3.备份修改的配置文件&#xff…

2.11 queue

#include<queue> 先进先出&#xff08;First In First Out, FIFO&#xff09; 队尾插入&#xff0c;队首删除 queue<int> q; q.push(1); //入队 int qf q.front(); //获取队首元素 int qe q.back(); //获取队尾元素 q.pop(); //出队 q.size(); //大小 q.…

简易中控紫猫插件版(3)压缩包使用说明

1.环境配置脚本运行环境&#xff1a;没什么说的 正常的最新版手机按键 当然还需要 最新的紫猫插件中控运行环境&#xff1a;首先要保证把压缩包的所有php文件都扔到网站的根目录下 必须保证网站的php版本是5.4 不然紫猫插件的php框架会出问题 然后你要知道网站数据库的账号和密…

Java9新特性

Java 8 发布三年多之后&#xff0c;即将快到2017年7月下一个版本发布的日期了。 你可能已经听说过 Java 9 的模块系统&#xff0c;但是这个新版本还有许多其它的更新。 这里有九个令人兴奋的新功能将与 Java 9 一起发布。 1. Java 平台级模块系统 Java 9 的定义功能是一套全新的…

IOS 应用中从竖屏模式强制转换为横屏模式

在 iPhone 应用里&#xff0c;有时我们想强行把显示模式从纵屏改为横屏&#xff08;反之亦然&#xff09;&#xff0c;CocoaChina 会员 “alienblue” 为我们提供了两种思路第一种&#xff1a;通过人为的办法改变view.transform的属性。具体办法&#xff1a;view.transform一般…

2.12 priority_queue

#include<queue> priority_queue与queue的不同&#xff1a;最大元素位于队首 priority_queue<int> pq; pq.push(1); //入队 pq.pop(); //出队 int i pq.top(); //获取队首元素 pq.size(); //大小 pq.empty(); //判空 如果队列元素是结构体&#xff0c;重载&…

vue资料链接

vue 官方api&#xff1a;https://cn.vuejs.org/ vue资源精选&#xff1a;http://vue.awesometiny.com/ vue GitHub地址&#xff1a;https://github.com/vuejs/vue element-ui 官方中文api&#xff1a;http://element-cn.eleme.io/#/zh-CN/component/dropdown swiper中文网&…

Java面试常见算法

在程序员的职业生涯中&#xff0c;算法亦算是一门基础课程&#xff0c;尤其是在面试的时候&#xff0c;很多公司都会让程序员编写一些算法实例&#xff0c;例如快速排序、二叉树查找等等。 本文总结了程序员在代码面试中最常遇到的10大算法类型&#xff0c;想要真正了解这些算法…

高仿人人Android梦想版终极源码发送(转)

经过几个月的努力,终于基本完成了人人API拥有的所有功能,界面采用仿照人人梦想版5.13制作,其中资源文件也采用人人的APK文件资源,完成的功能及知识点如下:1.通过三种动画仿照出人人引导页的放大切换图片的效果。2.通过重写ViewGroup仿照出人人菜单和其他界面的手势滑动切换效果…

HBase 基本Java API

数据库&#xff1a;HBaseConfiguration HBaseAdmin 表&#xff1a;HTable HTableDescriptor 列族&#xff1a;HColumnDescriptor 行列操作&#xff1a;Put Get Scanner HBaseConfiguration: Configuration create() //从classpath中查找hbase-site.xml初始化Configu…

A1075.PAT Judge

题意 输入k个程序的每个程序的满分分数&#xff0c;再输入m条用户提交的记录。按要求进行分数的排序最后输出。是一道结构体的复杂排序 思路分析 首先明确本题的输出要求&#xff1a; 编译失败的提交分数为-1。只有至少成功提交过一次程序(没有编译失败),的用户才会被排序。可以…

android 实现SSL握手协商

Android的私钥和信任证书的格式必须是BKS格式的&#xff0c;通过配置本地JDK&#xff0c;让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库 ssl通道建立前必须进行协商&#xff08;形成安全的通道--隧道技术&#xff09;。 服务端&#xff1a; View Co…