CGContext又叫图形高低文,相当于一块画布,以客栈情势存放,只有在当前 context上画图才有效。iOS有分多种图形高低文,此中UIView自带供给的在drawRect:办法中经由过程 UIGraphicsGetCurrentContext获取,还有专门为处理惩罚的context,UIGraphicsBeginImageContext函数生成,还有pdf的context等等。
1.一共有3种应用context的场景,此中每种场景都有2种办法画图
场景1:
//经由过程UIView的子类的drawRect:在高低文中绘制,该办法体系已筹办好一个cgcontext,并放置在高低文栈顶,rect形参就是context的尺寸大小
//当一个UIView的backgroundColor为nil和opaque为YES时,产生的context的靠山就为黑色的
- (void)drawRect:(CGRect)rect
{
//1.应用UIKit在context上绘制,UIKit的所有操纵只会在当前栈顶的context,所以须要重视当前栈顶的context是否你须要操纵的高低文
//UIImage,NSString,UIBezierPath,UIColor等可以直接在当前context上操纵
UIImage* image = [UIImage imageNamed:@"test.png"];
NSLog(@"size:%@",NSStringFromCGSize(image.size));
//UIImage直接在context上操纵,指定在context的哪个坐标上绘制,大小是原图的尺寸,若是大小超出了context的局限就会被截取掉
// [image drawAtPoint:CGPointMake(100, 100)];
//指定在context的哪个坐标上绘制,并指定绘制的尺寸大小,如许的尺寸就会被紧缩,不会超出context局限
[image drawInRect:CGRectMake(0, 0, rect.size.width/2, rect.size.height/2)];
//2.应用Core Graphics的函数在context上绘制,Core Graphics的函数须要context作为参数,只绘制在指定应用的context上
//功过UIGraphicsGetCurrentContext函数获取当前高低文栈顶的context,UIView体系已为其筹办好context并存放在栈顶了
// CGContextRef context = UIGraphicsGetCurrentContext();
// //画一个椭圆
// CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100));
// //填充色彩为蓝色
// CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
// //在context上绘制
// CGContextFillPath(context);
场景2:
//实现该办法,用于CALayer回调,CALayer经由过程它的类来进行画图操纵,切记切切不克不及把UIView作为CALayer的类,因为UIView自身有隐式的图层,若再把显式的图层赋给它会产生不有名错误的
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
{
//1.应用UIKit进行绘制,因为UIKit只会对当前高低文栈顶的context操纵,所以要把形参中的context设置为当前高低文
UIGraphicsPushContext(ctx);
UIImage* image = [UIImage imageNamed:@"test.png"];
//指定地位和大小绘制
[image drawInRect:CGRectMake(0, 0,100 , 100)];
UIGraphicsPopContext();
// UIGraphicsPushContext(ctx);
//2.应用Core Graphics进行绘制,须要显式应用context
// //画一个椭圆
// CGContextAddEllipseInRect(ctx, CGRectMake(0,0,100,100));
// //填充色彩为蓝色
// CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
// //在context上绘制
// CGContextFillPath(ctx);
// UIGraphicsPopContext();
}
LayerDelegate* delegate = [[LayerDelegate alloc]init];
CALayer* layer = [CALayer layer];
layer.anchorPoint = CGPointMake(0, 0);
layer.position = CGPointMake(100, 100);
layer.bounds = CGRectMake(0, 0, 200, 200);
layer.delegate = delegate;
//须要显式调用setNeedsDisplay来刷新才会绘制layer
[layer setNeedsDisplay];
[self.view.layer addSublayer:layer];
场景3:
//经由过程本身创建一个context来绘制,凡是用于对的处理惩罚
/*
申明一下UIGraphicsBeginImageContextWithOptions函数参数的含义:第一个参数默示所要创建的的尺寸;第二个参
数用来指定所生成的靠山是否为不透明,如上我们应用YES而不是NO,则我们获得的靠山将会是黑色,显然这不是我想要的;第三个参数指定生成
的缩放因子,这个缩放因子与UIImage的scale属性所指的含义是一致的。传入0则默示让的缩放因子按照屏幕的辨别率而变更,所以我们获得的图
片不管是在单辨别率还是视网膜屏上看起来都邑很好。
*/
//该函数会主动创建一个context,并把它push到高低文栈顶,坐标系也经处理惩罚和UIKit的坐标系雷同
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100));
//填充色彩为蓝色
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
//在context上绘制
CGContextFillPath(context);
//把当前context的内容输出成一个UIImage
UIImage* i = UIGraphicsGetImageFromCurrentImageContext();
//高低文栈pop出创建的context
UIGraphicsEndImageContext();
[i drawInRect:CGRectMake(0, 0, 100, 100)];
2.把全部屏幕转化为
UIImageView* imageV = [[UIImageView alloc]initWithFrame:CGRectMake(0,
0, self.view.frame.size.width, self.view.frame.size.height)];
UIGraphicsBeginImageContextWithOptions(imageV.frame.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
//把当前的全部画面导入到context中,然后经由过程context输出UIImage,如许就可以把全部屏幕转化为
[self.view.layer renderInContext:context];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
imageV.image = image;
UIGraphicsEndImageContext();
3.剪裁
//对一张进行剪裁
CGImageRef imageref = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(100, 100, 200, 50));
UIImageView* cropImage = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
cropImage.image = [UIImage imageWithCGImage:imageref];
CGImageRelease(imageref);
[self.view addSubview:cropImage];