Core Graphics绘图
iOS使用Core Graphics进行视图绘制主要有两种方式:
1,使用NSString、UIColor、UIImage、UIBreizePath在context上进行绘制
2,使用Core Graphics在context上进行绘制
视图绘制一般会在三种场景下使用:
1,在自定义view对象的drawRect:方法中进行绘制
注意:在调用自定义View的drawRect:方法前,系统已经创建了context并放入上下文的栈顶。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 自定义view已经准备好了context并放在栈顶,可以使用UIGraphicsGetCurrentContext获取当前context。 3 1,NSString、UIColor、UIImage、UIBezierPath可以在当前context上直接操作,不需要显示得获取context; 4 2,可以使用Core Graphics操作context,只需要将当前context作为参数传递给Core Graphics。 5 */ 6 7 - (void)drawRect:(CGRect)rect { 8 //第1种 9 { 10 UIImage* image = [UIImageimageNamed:@"a"]; 11 //(1)指定开始点,大小是原图尺寸,大于context范围就裁掉 12 //[image drawAtPoint:CGPointMake(180, 180)]; 13 //(2)指定开始点和大小,原图会被压缩 14 [image drawInRect:CGRectMake(180, 180, 10, 10)]; 15 } 16 //第2种 17 { 18 CGContextRef context = UIGraphicsGetCurrentContext(); 19 //画一个椭圆 20 CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100)); 21 //填充颜色为蓝色 22 CGContextSetFillColorWithColor(context, [UIColorblueColor].CGColor); 23 //在context上绘制 24 CGContextFillPath(context); 25 } 26 }
2,在CALayer回调中进行绘制
注意:回调方法给出了context,但是需要手动将context放入当前上下文的栈顶。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 使用CALayer回调,CALayer通过它的代理类来进行绘图操作,切记千万不能把UIView作为CALayer的代理类,因为UIView自身有隐式的图层,若再把显式的图层赋给它会发生不知名错误的 3 非自定义view的情况下,上下文环境不存在content,此时需要先通过UIGraphicsPushContext方法可以把形参context放入上下文,才可进行之后的操作: 4 1,NSString、UIColor、UIImage、UIBezierPath可以在当前context上直接操作,不需要显示得获取context; 5 2,可以使用Core Graphics操作context,只需要将当前context作为参数传递给Core Graphics。 6 */ 7 -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{ 8 UIGraphicsPushContext(ctx); 9 10 //第1种 11 { 12 UIImage* image = [UIImageimageNamed:@"a"]; 13 //(1)指定开始点,大小是原图尺寸,大于context范围就裁掉 14 //[image drawAtPoint:CGPointMake(180, 180)]; 15 //(2)指定开始点和大小,原图会被压缩 16 [image drawInRect:CGRectMake(180, 180, 10, 10)]; 17 } 18 19 // 第2种 20 { 21 CGContextRef context = UIGraphicsGetCurrentContext(); 22 //画一个椭圆 23 CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100)); 24 //填充颜色为蓝色 25 CGContextSetFillColorWithColor(context, [UIColorblueColor].CGColor); 26 //在context上绘制 27 CGContextFillPath(context); 28 } 29 30 UIGraphicsPopContext(); 31 }
3, 通过自己创建一个context来绘图,通常用于对图片的处理。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 解释一下UIGraphicsBeginImageContextWithOptions函数参数的含义: 3 第一个参数表示所要创建的图片的尺寸; 4 第二个参数用来指定所生成图片的背景是否为不透明,如上我们使用YES而不是NO,则我们得到的图片背景将会是黑色,显然这不是我想要的; 5 第三个参数指定生成图片的缩放因子,这个缩放因子与UIImage的scale属性所指的含义是一致的。传入0则表示让图片的缩放因子根据屏幕的分辨率而变化,所以我们得到的图片不管是在单分辨率还是视网膜屏上看起来都会很好。 6 */ 7 -(void)customDrawImg{ 8 //该函数会自动创建一个context,并把它push到上下文栈顶,坐标系也经处理和UIKit的坐标系相同 9 UIGraphicsBeginImageContextWithOptions(CGSizeMake(50, 50), NO, 0); 10 11 CGContextRef context = UIGraphicsGetCurrentContext(); 12 CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100)); 13 CGContextSetFillColorWithColor(context, [UIColorblueColor].CGColor);//填充颜色为蓝色 14 CGContextFillPath(context);//在context上绘制 15 UIImage* i = UIGraphicsGetImageFromCurrentImageContext();//把当前context的内容输出成一个UIImage图片 16 17 UIGraphicsEndImageContext();//上下文栈pop出创建的context 18 19 _iv.image = i; 20 } 21 // 屏幕转化为图片 22 -(void)getScreenShot{ 23 24 UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0); 25 CGContextRef context = UIGraphicsGetCurrentContext(); 26 //把当前的整个画面导入到context中,然后通过context输出UIImage,这样就可以把整个屏幕转化为图片 27 [self.view.layerrenderInContext:context]; 28 UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); 29 UIGraphicsEndImageContext(); 30 31 _iv.image = image; 32 } 33 // 裁剪图片 34 -(void)cropImg{ 35 UIImage* image = [UIImageimageNamed:@"a"]; 36 37 CGImageRef imageref = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0, 0, 80, 40)); 38 _iv.image = [UIImageimageWithCGImage:imageref]; 39 CGImageRelease(imageref); 40 41 }