有一個需求敢艰,每次push一個頁面的時候诬乞,push過去的頁面的背景圖片需要時上一個頁面的樣子。钠导。震嫉。不知道有沒有用這短小精干的語言描述清楚。
<br />
那么這個需求我是這么考慮的牡属,把window轉(zhuǎn)換成image票堵,然后傳入下一個頁面。
<br />
所以接觸了一下Quart2D逮栅。
<br />
今天就來說說CGContextSaveGState(主要)悴势,UIGraphicsPushContext窗宇。
- (void)drawRect:(CGRect)rect{ // do drawing here}
在iOS繪圖的時候大家都會用到這個這個方法。
在調(diào)用這個方法之前瞳浦,繪畫系統(tǒng)創(chuàng)建了一個上下文(CGContext)担映,也可以說是畫布。上下文中包含了很多信息叫潦,比如畫筆顏色蝇完,字體顏色,填充顏色矗蕊,字體短蜕,形狀等等。
由于只有一個CGContext傻咖,也就是說只有一個畫筆朋魔,如果你變化了畫筆的顏色等狀態(tài),就會影響函數(shù)調(diào)用的結(jié)果卿操,那么我們就會用到CGContextSaveGState與CGContextRestoreGState將上下文入棧出棧警检。
通常CGContextSaveGState和CGContextRestoreGState都是成對出現(xiàn)的。
<br />
- (void)drawRect:(CGRect)rect{
//1.獲得當(dāng)前上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//2.設(shè)置畫筆顏色為紅色害淤,并入棧上下文扇雕,之后把畫筆改為黑色,然后出棧上下文窥摄,你會發(fā)現(xiàn)畫筆又變?yōu)榱俗畛醯募t色镶奉。
[[UIColor redColor] setStroke];
CGContextSaveGState(UIGraphicsGetCurrentContext());
[[UIColor blackColor] setStroke];
CGContextRestoreGState(UIGraphicsGetCurrentContext());
UIRectFill(CGRectMake(10, 10, 100, 100)); // 紅
}
UIGraphicsPushContext
如果這段代碼中的CGContextSaveGState和CGContextRestoreGState換成UIGraphicsPushContext和UIGraphicsPopContext就不對了。
因為UIGraphicsPushContext并沒有保存該上下文當(dāng)前狀態(tài)的功能崭放,而是完全的切換上下文哨苛。
那么什么時候會用到UIGraphicsPushContext呢?
假設(shè)你正在當(dāng)前視圖上下文中繪制什么東西币砂,這時想要在位圖上下文中繪制完全不同的東西建峭。如果要使用UIKit來進行任意繪圖,你會希望保存當(dāng)前的UIKit上下文决摧,包括所有已經(jīng)繪制的內(nèi)容迹缀,接著切換到一個全新的繪圖上下文中。這就是UIGraphicsPushContext的功能蜜徽。創(chuàng)建完位圖后,再將你的舊上下文出棧票摇。而這就是UIGraphicsPopContext的功能拘鞋。這種情況只會在要使用UIKit在新的位圖上下文中繪圖時才會發(fā)生。只要你使用的是Core Graphics函數(shù)矢门,就不需要去執(zhí)行上下文入棧和出棧盆色,因為Core Graphics函數(shù)將上下文視作參數(shù)灰蛙。(摘錄自http://blog.csdn.net/lihangqw/article/details/9969961)
接下來就說說UIImage繪制的一些操作
一般步驟為:
UIGraphicsBeginImageContext(CGSize size)
或者
UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)
準(zhǔn)備繪圖環(huán)境
CGContextRef __nullable UIGraphicsGetCurrentContext(void)
獲取繪圖的CGContextRef
開始繪圖
UIImage* UIGraphicsGetImageFromCurrentImageContext(void);
獲取當(dāng)前繪制的圖形
void UIGraphicsEndImageContext(void);
關(guān)閉繪圖環(huán)境
接下來就從幾個簡單的?? 中體會一下吧~
//圖片按比例壓縮
-(UIImage *)image:(UIImage *)img toScale:(float)scale {
UIGraphicsBeginImageContext(CGSizeMake(img.size.width, img.size.height)); //準(zhǔn)備繪畫環(huán)境
[img drawInRect:CGRectMake(0, 0, img.size.width * scale, img.size.height * scale)];//繪畫
UIImage *endImg = UIGraphicsGetImageFromCurrentImageContext();//獲取當(dāng)前繪制的圖形
UIGraphicsEndImageContext();//結(jié)束繪畫
return endImg;
}
//將UIView轉(zhuǎn)為UIImage
- (UIImage *)captureView:(UIView *)theView {
CGRect rect = theView.frame;
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, -70); //截取位置下移70
[theView.layer renderInContext:context];
UIImage *endImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return endImage;
}
//截取圖片
- (UIImage *)getImageWithImage:(UIImage *)img {
CGRect myRect = CGRectMake(10, 10,300, 300);
CGImageRef bigRef = img.CGImage;
CGImageRef subImageRef = CGImageCreateWithImageInRect(bigRef, myRect);
CGSize size = CGSizeMake(300, 300);
UIGraphicsBeginImageContext(size);
CGContextDrawImage(UIGraphicsGetCurrentContext(), myRect, subImageRef);
UIImage *smallImage = [UIImage imageWithCGImage:subImageRef];
UIGraphicsEndImageContext();
return smallImage;
}
//截取當(dāng)前屏幕
+ (UIImage *)screenshot
{
CGSize imageSize = [[UIScreen mainScreen] bounds].size;
UIGraphicsBeginImageContext(imageSize);
CGContextRef context = UIGraphicsGetCurrentContext();
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {
CGContextSaveGState(context);
CGContextTranslateCTM(context, [window center].x, [window center].y);
CGContextConcatCTM(context, [window transform]);
CGContextTranslateCTM(context,
-[window bounds].size.width * [[window layer] anchorPoint].x,
-[window bounds].size.height * [[window layer] anchorPoint].y);
[[window layer] renderInContext:context];
CGContextRestoreGState(context);
}
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
//將兩張圖片合成一張
- (UIImage *)addImageWithImage1:(UIImage *)image1 Image2:(UIImage *)image2 {
UIGraphicsBeginImageContext(image1.size);
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];
[image2 drawInRect:CGRectMake(0, 0, image2.size.width-200, image2.size.height-200)];
UIImage *endImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return endImage;
}
//截取scrollview
-(UIImage *)captureScrollView:(UIScrollView *)scrollView{
UIImage* image = nil;
UIGraphicsBeginImageContext(scrollView.contentSize);
scrollView.contentOffset = CGPointZero;
scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}