圖形上下文棧

看了幾篇網(wǎng)上圖形上下文棧的講解卿闹,不知道是我理解有問題揭糕,還是沒找到好文章萝快,還是壓根作者也不是特別明白,欺騙我著角。最后決定自己寫一個(gè)demo揪漩,好好理解一下


什么是圖像上下文棧?
我的理解就是吏口,保存當(dāng)前的上下文樣式奄容,當(dāng)需要的時(shí)候直接還原,不用一直寫垃圾代碼

將來要做的樣式和代碼解釋圖
- (void)drawRect:(CGRect)rect {
    //圖形上下文棧
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //第一根線产徊,頭部是圓角昂勒,線是紅色的,線寬10px
    CGContextMoveToPoint(ctx, 10, 10);
    CGContextAddLineToPoint(ctx, 10, 90);
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, 4);
    [[UIColor redColor] set];
    //保存第一個(gè)圖形上下文樣式
    CGContextSaveGState(ctx);
    CGContextStrokePath(ctx);
    
    //第2根線,頭部是直角舟铜,線是綠色的,線寬10px
    CGContextMoveToPoint(ctx, 30, 10);
    CGContextAddLineToPoint(ctx, 30, 43);
    CGContextSetLineWidth(ctx, 12);
    CGContextSetLineCap(ctx, kCGLineCapButt);
    [[UIColor greenColor] set];
    //保存第二個(gè)圖形上下文樣式
    CGContextSaveGState(ctx);
    CGContextStrokePath(ctx);
    
    
    //第3根線戈盈,頭部是kCGLineCapSquare,線是橙色的,線寬20px
    CGContextMoveToPoint(ctx, 60, 40);
    CGContextAddLineToPoint(ctx, 40, 180);
    CGContextSetLineWidth(ctx, 4);
    CGContextSetLineCap(ctx, kCGLineCapSquare);
    [[UIColor orangeColor] set];
    //保存第三個(gè)圖形上下文樣式
    CGContextSaveGState(ctx);
    CGContextStrokePath(ctx);
    
    //直接繪制一個(gè)直線谆刨,看看是什么樣子的(其實(shí)是和第三個(gè)樣式相同)
    CGContextMoveToPoint(ctx, 90, 10);
    CGContextAddLineToPoint(ctx, 90, 99);
    CGContextStrokePath(ctx);
    
    //從圖像上下文中獲取一個(gè)數(shù)據(jù)試試
    CGContextRestoreGState(ctx);
    CGContextMoveToPoint(ctx, 120, 10);
    CGContextAddLineToPoint(ctx, 120, 130);
    CGContextStrokePath(ctx);
    
    //突然想繪制第四個(gè)線塘娶,和第一根線一樣
    CGContextMoveToPoint(ctx, 140, 10);
    CGContextAddLineToPoint(ctx, 140, 99);
    CGContextStrokePath(ctx);
    
    //突然想繪制一個(gè)圓形,和第一根線的屬性基本一致
    //即使使用一個(gè)圖形上下文痊夭,也不影響使用屬性和繪制多個(gè)圖形
    CGContextAddArc(ctx, 200, 60, 20, 0, 189/360.0*2*M_PI, NO);
    CGContextStrokePath(ctx);
    
    //從圖形上下文棧中在獲取一個(gè)試試
    CGContextRestoreGState(ctx);
    CGContextMoveToPoint(ctx, 250, 10);
    CGContextAddLineToPoint(ctx, 250, 100);
    CGContextStrokePath(ctx);
    
![Uploading Simulator Screen Shot 2016年8月7日 下午12.55.32_489724.png . . .]
    //再去從圖形上下文棧中在獲取一個(gè)
    CGContextRestoreGState(ctx);
    CGContextMoveToPoint(ctx, 300, 10);
    CGContextAddLineToPoint(ctx, 300, 100);
    CGContextStrokePath(ctx);
    
}

注意:
1.入棧CGContextSaveGState(cox)
2.出棧CGContextRestoreGState(ctx);
3.如果出戰(zhàn)的次數(shù)大于入棧刁岸,就會(huì)奔潰
4.什么是入棧?就是拷貝當(dāng)前圖形上下文她我,然后放到棧中虹曙,因?yàn)槭褂?code>CGContextRef,只有一個(gè)圖形上下文鸦难,所以要拷貝根吁!
5.如何理解拷貝圖形上下文,我們操作的圖形上下文成為A,此時(shí)如果圖形上下文就設(shè)置了[[UIColor redColor] set]這一個(gè)屬性合蔽,拷貝A击敌,入棧(我們把拷貝后入棧的成為B),將來不論以后我們?nèi)绾尾僮鰽拴事,設(shè)置了多少屬性沃斤,以后的都是A這個(gè)模樣,但是我們出戰(zhàn)B刃宵,將來使用的樣式都是只有一個(gè)[[UIColor redColor] set]的狀態(tài)衡瓶!說白了,就是保存某種圖形上下文的狀態(tài)牲证!
5.出戰(zhàn)的上下文哮针,將樣式賦值給當(dāng)前樣式,然后釋放

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市十厢,隨后出現(xiàn)的幾起案子等太,更是在濱河造成了極大的恐慌,老刑警劉巖蛮放,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩抡,死亡現(xiàn)場離奇詭異,居然都是意外死亡包颁,警方通過查閱死者的電腦和手機(jī)瞻想,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娩嚼,“玉大人蘑险,你說我怎么就攤上這事≡牢颍” “怎么了漠其?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長竿音。 經(jīng)常有香客問我,道長拴驮,這世上最難降的妖魔是什么春瞬? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮套啤,結(jié)果婚禮上宽气,老公的妹妹穿的比我還像新娘。我一直安慰自己潜沦,他們只是感情好萄涯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唆鸡,像睡著了一般涝影。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上争占,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天燃逻,我揣著相機(jī)與錄音,去河邊找鬼臂痕。 笑死伯襟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的握童。 我是一名探鬼主播姆怪,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稽揭?” 一聲冷哼從身側(cè)響起俺附,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淀衣,沒想到半個(gè)月后昙读,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膨桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年蛮浑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只嚣。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沮稚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出册舞,到底是詐尸還是另有隱情蕴掏,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布调鲸,位于F島的核電站盛杰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藐石。R本人自食惡果不足惜即供,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望于微。 院中可真熱鬧逗嫡,春花似錦、人聲如沸株依。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋腕。三九已至抹锄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荠藤,已是汗流浹背祈远。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留商源,地道東北人车份。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像牡彻,于是被迫代替她去往敵國和親扫沼。 傳聞我的和親對象是個(gè)殘疾皇子出爹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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

  • 繪圖的完整過程 程序啟動(dòng),顯示自定義的view缎除。當(dāng)程序第一次顯示在我們眼前的時(shí)候严就,程序會(huì)調(diào)用drawRect:方法...
    F麥子閱讀 451評論 0 0
  • 展示效果: 請問:實(shí)現(xiàn)的步驟是什么? 第一步,首先繪制一個(gè)線條,一個(gè)橢圓,和一個(gè)矩形框,然后添加到路徑中,進(jìn)行渲染...
    青蔥烈馬閱讀 415評論 0 0
  • 原文此文提出一個(gè)新的名稱:圖形上下文棧器罐,這個(gè)名稱能更好的解析繪圖的工作流程梢为。接下來先看代碼:繪制兩條不一樣的線條 ...
    MR_詹閱讀 189評論 0 0
  • 保存圖形上下文狀態(tài): CGContextSaveGstate: 恢復(fù)圖形上下文狀態(tài): CGContextResto...
    隨風(fēng)飄蕩的小逗逼閱讀 176評論 0 0
  • 效果圖: 主要代碼 主要原理圖:
    Z了個(gè)L閱讀 603評論 0 1