iOS繪圖筆記——圖形上下文Drawing Context(1)

(是通過(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ǔ)位圖上下文

Listing 1-1

b.上下文選擇權(quán)許可允許以設(shè)備尺寸繪圖(我也不知道我翻譯的什么鬼虾宇。搓彻。。原文Context Opttions Enable Drawing at Device Scale)

Listing 1-2

鼓勵(lì)使用第二種方法創(chuàng)建位圖上下文旭贬。

2.創(chuàng)建PDF上下文

Listing 1-3

創(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的方法钞诡。

Listing 1-4

6.在上下文里繪圖 Drawing into Contexts

確切的說(shuō)攒读,使用Quartz的方法在上下文里繪圖。

Listing 1-5 繪制了一個(gè)線寬為4像素的灰色圓

1-5的內(nèi)容是寫在1-4里面的~

7.在UIKit上下文里面繪圖 Drawing Within a UIKit Context

?這個(gè)例子的關(guān)鍵在UIGraphicsGetCurrentContext()通過(guò)UIKit的方法得到CG的context。

Listing 1-6

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è)橢圓~~

Listing 1-7

同樣是畫了一個(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

Figure 1-9

通過(guò)CGContextSaveGState(context)和CGContextRestoreGState(context)可以實(shí)現(xiàn)保存之前的繪圖狀態(tài)苫耸。


Listing 1-9 太長(zhǎng)了又比較簡(jiǎn)單懶得自己再打一遍了州邢。


Figure 1-10

代碼和效果圖如上。保存了之前第一次 繪圖 的狀態(tài)。

狀態(tài)類型~

一個(gè)上下文可以存儲(chǔ)很多種的狀態(tài)量淌,不僅僅是fill和stroke骗村。下面我們用一個(gè)表來(lái)看看吧~

table1-1(1)

t

table 1-1(2)


table1-1 (3)

加粗字體提醒自己回頭吧這個(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é)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末癣猾,一起剝皮案震驚了整個(gè)濱河市敛劝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纷宇,老刑警劉巖夸盟,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異像捶,居然都是意外死亡上陕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門拓春,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)释簿,“玉大人,你說(shuō)我怎么就攤上這事硼莽∈埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)偏螺。 經(jīng)常有香客問(wèn)我行疏,道長(zhǎng),這世上最難降的妖魔是什么套像? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任酿联,我火速辦了婚禮,結(jié)果婚禮上夺巩,老公的妹妹穿的比我還像新娘货葬。我一直安慰自己,他們只是感情好劲够,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著休傍,像睡著了一般征绎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磨取,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天人柿,我揣著相機(jī)與錄音,去河邊找鬼忙厌。 笑死凫岖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逢净。 我是一名探鬼主播哥放,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爹土!你這毒婦竟也來(lái)了甥雕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胀茵,失蹤者是張志新(化名)和其女友劉穎社露,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼娘,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峭弟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脱拼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞒瘸。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熄浓,靈堂內(nèi)的尸體忽然破棺而出挨务,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布谎柄,位于F島的核電站丁侄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏朝巫。R本人自食惡果不足惜鸿摇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劈猿。 院中可真熱鬧拙吉,春花似錦、人聲如沸揪荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仗颈。三九已至佛舱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挨决,已是汗流浹背请祖。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脖祈,地道東北人肆捕。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盖高,于是被迫代替她去往敵國(guó)和親慎陵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容