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.pswp.cn/news/387460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387460.shtml
英文地址,請注明出處:http://en.pswp.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…