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

简介:

一、绘图路径

A.简单说明

在画线的时候,方法的内部默认创建一个path。它把路径都放到了path里面去。

1.创建路径 cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息。

2.把绘图信息添加到路径里边。

以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部创建一个path用来保存绘图信息。

在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePathRef。

3.把路径添加到上下文中。

代码示例:

绘制一条直线的代码:

复制代码
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)rect
 2 {
 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.m
 3 // 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
复制代码

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

目录
相关文章
|
9月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
313 15
|
9月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
352 11
|
5月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
463 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
8月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
301 56
|
8月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
447 55
|
9月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
366 14
|
8月前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
253 1
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
813 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
10月前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
289 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡

热门文章

最新文章