(是通過(guò)英文資料iOS Drawing扣扣巴巴一點(diǎn)點(diǎn)翻譯過(guò)來(lái)的筆記薪韩。應(yīng)該會(huì)有不少不對(duì)的地方抬闷,諒解~)
圖形上下文(drawing context)是指在你的應(yīng)用里有一個(gè)虛擬的畫布(canvas)用來(lái)繪圖。你可以通過(guò)“上下文”(雖然我也不清楚上下文是啥意思,就是context這個(gè)單詞的翻譯。喳资。)來(lái)創(chuàng)建圖像,文件和自定義視圖腾供,通過(guò)學(xué)習(xí)UIKit仆邓,Core Graphics和 Quartz里的基礎(chǔ)繪圖方法。
1.Framework框架
iOS的繪圖程序主要源于UIKit和QuartzCore Framework伴鳖。QuartzCore Framework就是我們常說(shuō)的节值,Quartz或者Quartz 2D。Quartz這個(gè)名字比蘋果內(nèi)部貫徹的名字Core Graphics要出名的多榜聂,這本書(《iOS Drawing》)里提到的Quartz和Core Graphics都是同一個(gè)意思搞疗。大多以CG開頭的c語(yǔ)言API都是取自Core Graphics,
?通常我們說(shuō)的框架有兩種:一是须肆,UIKit繪圖框架匿乃;二是,Quartz豌汇;
????下面的章節(jié)會(huì)用特別多的例子來(lái)說(shuō)明UIKit繪圖和Quartz繪圖的區(qū)別和聯(lián)系扳埂,如何交互使用等等,請(qǐng)?zhí)貏e注意瘤礁。
?比如例子畫一個(gè)圓角矩形框
?通過(guò)UIKit
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:inset cornerRadius:12];
[bezierPath stroke];
?通過(guò)Quartz
CGContextFillEllipseInRect(context,rect)梅尤;
2.When to Draw是什么時(shí)候使用呢柜思?
1.創(chuàng)建自定義視圖;2.構(gòu)建圖像巷燥;3.創(chuàng)建pdf文件赡盘;4.處理核心圖像
1.創(chuàng)建自定義視圖 creating custom views
本質(zhì)上,每一個(gè)UIKit的視圖都是一個(gè)空的畫布缰揪。你可以完全自定義的畫出一個(gè)視圖陨享。你只需要在一個(gè)特殊的方法drawRect:方法里繪制出來(lái)葱淳,這個(gè)方法允許你自定義視圖的樣子通過(guò)UIKit和Quartz里的繪圖方法。
2.構(gòu)建圖像 building images
在iOS中抛姑,你一可以引入一個(gè)UIKit image內(nèi)容或重新使用一個(gè)UIImage單例赞厕。它允許你創(chuàng)建一個(gè)新的圖像或者修改一個(gè)存在的圖像。Drawing允許你處理自定義圖像不依賴于已存在的庫(kù)或圖片文件定硝。
3.創(chuàng)建pdf文件 creating PDFs
你可以繪制出一個(gè)UIKit pdf上下文皿桑,它既不直接出一個(gè)文件也不保存數(shù)據(jù)。它允許你處理來(lái)自app的pdf內(nèi)容蔬啡,分享诲侮,存儲(chǔ),或者展示它們箱蟆。
4.處理核心圖像 building with Core Graphics
你也許想一字節(jié)一字節(jié)地訪問(wèn)圖片數(shù)據(jù)沟绪,這個(gè)需求用UIKit就不是很好完成,但是在Core Graphics的位圖上下文中便可以完美地處理空猜。比如通過(guò)Core Graphics把RGB圖像轉(zhuǎn)換為灰度圖像绽慈。
3.上下文Contexts
每一個(gè)iOS繪圖操作都從一個(gè)context開始。從概念上說(shuō)抄肖,上下文和一個(gè)空白頁(yè)或者一個(gè)空畫布相似久信。它們包括了所有繪圖中的狀態(tài)和信息。
在iOS中漓摩,最重要的圖形上下文有兩個(gè):位圖(bitmap)上下文和PDF上下文裙士。核心圖形庫(kù)還提供了第三個(gè)上下文的類型,它用來(lái)完成圖片處理任務(wù)而非用來(lái)繪圖管毙。
1.位圖上下文 Bitmap Context
位圖上下文本質(zhì)上是一個(gè)二維數(shù)組數(shù)據(jù)腿椎。這些數(shù)據(jù)的大小取決于每一個(gè)像素點(diǎn)的顏色類型代表著人什么。比如RGB圖夭咬,灰度圖等等啃炸。
2.PDF上下文 PDF Context
PDF很多地方和位圖上下文相似,它們通過(guò)相同的命令和方法來(lái)繪制卓舵,你設(shè)置顏色或者繪制形狀或文本就和繪制一個(gè)視圖或者圖像差不多南用。當(dāng)然,他們也有不同的地方掏湾。
PDF以存有矢量數(shù)據(jù)裹虫。PDF上下文的內(nèi)容也可能多于一頁(yè),你需要?jiǎng)?chuàng)建邊界矩形來(lái)具體說(shuō)明默認(rèn)尺寸和每一頁(yè)P(yáng)DF頁(yè)的位置融击。
3.核心圖像上下文 Core Image Contexts
Core Image framework可以讓你快速的處理圖像筑公。有了它,你可以處理濾鏡尊浪,濾鏡鏈匣屡,實(shí)現(xiàn)特點(diǎn)捕捉(可以找到照片中的臉和眼睛)封救,分析圖片使它自適應(yīng)。
4.用UIKit創(chuàng)建一個(gè)上下文Establishing contexts in UIKit
1.創(chuàng)建一個(gè)位圖上下文
?注意所有方法等前綴捣作,這里UI開頭誉结,都是用的是UIKit的方法。
a.基礎(chǔ)位圖上下文
b.上下文選擇權(quán)許可允許以設(shè)備尺寸繪圖(我也不知道我翻譯的什么鬼虾宇。搓彻。。原文Context Opttions Enable Drawing at Device Scale)
鼓勵(lì)使用第二種方法創(chuàng)建位圖上下文旭贬。
2.創(chuàng)建PDF上下文
創(chuàng)建一個(gè)PDF上下文,你必須有一個(gè)文件路徑或者可變data對(duì)象,還需要提供一個(gè)邊界框,以及一個(gè)字典狭魂,用來(lái)具體說(shuō)明元數(shù)據(jù)和安全信息。比如說(shuō),你想著名作者或者用戶密碼睬涧,文件權(quán)限等等。
5.用Quartz創(chuàng)建一個(gè)上下文参袱。
?這一個(gè)例子的方法均用的CG開頭的方法剿牺,Core Graphics也就是Quartz的方法钞诡。
6.在上下文里繪圖 Drawing into Contexts
確切的說(shuō)攒读,使用Quartz的方法在上下文里繪圖。
1-5的內(nèi)容是寫在1-4里面的~
7.在UIKit上下文里面繪圖 Drawing Within a UIKit Context
?這個(gè)例子的關(guān)鍵在UIGraphicsGetCurrentContext()通過(guò)UIKit的方法得到CG的context。
UIKit簡(jiǎn)化了創(chuàng)建和管理上下文的方法,一句話就可以完成創(chuàng)建一個(gè)圖像上下文或者PDF上下文,看看跟1-4幢竹,1-5比起來(lái)是不是簡(jiǎn)單多了?用UIGraphicsGetCurrentContext()方法就可以直接獲取到當(dāng)前的圖像或者PDF上下文~
當(dāng)然,在現(xiàn)在的UIKit里面還有更加先進(jìn)的方法來(lái)完成繪制一個(gè)橢圓~~
同樣是畫了一個(gè)橢圓,卻沒(méi)有提到上下文context~是不是很神奇乞旦。(書里有一大段都是在描述沒(méi)有上下文很神奇,我就不翻譯了~)
發(fā)生了什么事情呢,事情是這樣的。UIKit擁有一個(gè)圖形上下文的堆棧舔琅,可以把繪圖操作放到棧頂?shù)纳舷挛娜ネ瓿纱鸦_@些設(shè)置,比如說(shuō)灰色况凉,也都會(huì)推倒棧頂?shù)纳舷挛睦锶ァ?/p>
那么問(wèn)題來(lái)了知市,怎么才能讓核心繪圖上下文和UIKit融為一體呢规哲?有兩個(gè)關(guān)鍵的方法就來(lái)了~
· 你可以手動(dòng)推出一個(gè)上下文跟啤,通過(guò)UIGraphicsPushContext(context)方法。這個(gè)方法可以把上下文推到UIKit棧的頂端。
·你也可以調(diào)用UIGraphicsPopContext()隅肥。這個(gè)方法可以把堆棧頂端的上下文移除UIKit的上下文棧关顷,激活堆棧的下一個(gè)上下文或者置空。
總結(jié)
總結(jié)來(lái)了~~
混合使用核心圖像上下文(Core Graphics context)和UIKit繪圖武福,有以下幾步:
1.創(chuàng)建一個(gè)核心繪圖上下文。
2.UIGraphicsPushContext(context)痘番。
3.使用UIKit繪圖方法和Quartz的繪圖方法結(jié)合來(lái)完成繪圖捉片。
4.(取回上下文的內(nèi)容,得到一個(gè)image)
5.釋放上下文汞舱。
8.UIKit和Quartz的顏色
在iOS開發(fā)術(shù)語(yǔ)中有一個(gè)叫 toll free bridged(不用通行費(fèi)就可以過(guò)橋伍纫。。昂芜。)的東西莹规,什么意思呢,就是說(shuō)很多核心庫(kù)里面的數(shù)據(jù)類型也可也通過(guò)交換在UIKit里面使用泌神。比如說(shuō)良漱,ARC里面的__bridge。但是不幸的是欢际,這個(gè)橋梁在Quartz和UIKit的關(guān)系里卻是缺席的母市,包括顏色。
在很多繪圖的類里面损趋,UIKit通過(guò)Objective-C把Quartz的方法和Core Graphics里面的類包裝起來(lái)患久。比如UIColor里面包了個(gè)CGColor,UIBezierPath里面包了個(gè)CGPath浑槽,UIImage里面包了CGImage和CIImage蒋失。這些東西都不是等價(jià)的。雖然你可以很容易的訪問(wèn)到背后的Quartz元素桐玻,但著并不能算是一個(gè)橋篙挽。
9.畫家模型 The Painter's Model
iOS用一個(gè)叫“畫家模型”的東西在上下文中繪圖。除非你特別說(shuō)明畸冲,所有的畫都會(huì)畫在原有畫的上面嫉髓。就像一個(gè)畫家物理繪圖是一樣的,
10.上下文狀態(tài) Context State
setFill 方法用顏色來(lái)涂滿繪圖邊界線的內(nèi)部邑闲。
setStroke 只是用來(lái)給繪圖邊界描一個(gè)邊算行。
如圖1-9.綠色是fill 。紫色是 stroke
通過(guò)CGContextSaveGState(context)和CGContextRestoreGState(context)可以實(shí)現(xiàn)保存之前的繪圖狀態(tài)苫耸。
代碼和效果圖如上。保存了之前第一次 繪圖 的狀態(tài)。
狀態(tài)類型~
一個(gè)上下文可以存儲(chǔ)很多種的狀態(tài)量淌,不僅僅是fill和stroke骗村。下面我們用一個(gè)表來(lái)看看吧~
t
加粗字體提醒自己回頭吧這個(gè)表翻譯成中文
為什么越寫到后面越來(lái)越卡,特別是倒入圖片之后呀枢。胚股。寫著好累啊。裙秋。琅拌。還是把 drawing context這一章分開寫算了。摘刑。进宝。
后面還有幾節(jié),分別是
Context Coordinate System 上下文中的坐標(biāo)系枷恕;
Clipping 剪輯党晋;
Transforms 調(diào)整;
setting line parameters 線的參數(shù)設(shè)置徐块;
總結(jié)未玻;
然后第二章是 The Language of Geometry 幾何語(yǔ)言
Points Versus Pixels 點(diǎn)和像素;
View Coordinates 視圖坐標(biāo)胡控;
Key Structures 關(guān)鍵結(jié)構(gòu)深胳;
Using CGRectDivide() 使用前面這個(gè)方法;
Rectangle Utilities ?矩形工具铜犬;
Fitting and Filling 擬合和填充舞终;
Summary總結(jié)。