在調(diào)用drawRect:方法之前,繪圖系統(tǒng)創(chuàng)建了一個圖形上下文(CGContext)。上下文包括大量信息,比如畫筆顏色、文本顏色、當(dāng)前字體、變形等。有時你可能想要修改上下文并使其恢復(fù)原樣。舉個例子,你現(xiàn)在有一個使用特定顏色繪制特定形狀的函數(shù)。由于只能有一只畫筆,因此在更改顏色后,就會影響調(diào)用函數(shù)的結(jié)果。為了避免這個副作用,你可以使用CGContextSaveGState和CGContextRestoreGState將上下文入棧和出棧。
不要與看起來相似的UIGraphicsPushContext和UIGraphicsPopContext混淆。它們做的并不是同一件事。CGContextSaveGState記錄上下文的當(dāng)前狀態(tài)。UIGraphicsPushContext更改當(dāng)前上下文。以下是CGContextSaveGState的示例。
[[UIColor redColor]setStroke];
CGContextSaveGState(UIGraphicsGetCurrentContext());
[[UIColor blackColor]setStroke];
CGContextRestoreGState(UIGraphicsGetCurrentContext());
UIRectFill(CGRectMake(10,10,100,100));//紅
這段代碼設(shè)置了畫筆的顏色為紅色并保存了上下文。之后它將把畫筆顏色改成黑色并恢復(fù)上下文。這樣當(dāng)你繪圖的時候,畫筆又會變成紅色了。
使用UIGraphicsPushContext并不能保存上下文的當(dāng)前**狀態(tài)**(畫筆顏色、線條寬度等),而是完全切換上下文。假設(shè)你正在當(dāng)前視圖上下文中繪制什么東西,這時想要在位圖上下文中繪制完全不同的東西。如果要使用UIKit來進(jìn)行任意繪圖,你會希望保存當(dāng)前的UIKit上下文,包括所有已經(jīng)繪制的內(nèi)容,接著切換到一個全新的繪圖上下文中。這就是UIGraphicsPushContext的功能。創(chuàng)建完位圖后,再將你的舊上下文出棧。而這就是UIGraphicsPopContext的功能。這種情況只會在要使用UIKit在新的位圖上下文中繪圖時才會發(fā)生。只要你使用的是Core Graphics函數(shù),就不需要去執(zhí)行上下文入棧和出棧,因為Core Graphics函數(shù)將上下文視作參數(shù)。
轉(zhuǎn)自:http://blog.csdn.net/nlforever/article/details/11835725