博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Core Graphics绘图
阅读量:5054 次
发布时间:2019-06-12

本文共 4044 字,大约阅读时间需要 13 分钟。

iOS使用Core Graphics进行视图绘制主要有两种方式:

1,使用NSString、UIColor、UIImage、UIBreizePath在context上进行绘制

2,使用Core Graphics在context上进行绘制

 

视图绘制一般会在三种场景下使用:

1,在自定义view对象的drawRect:方法中进行绘制

  注意:在调用自定义View的drawRect:方法前,系统已经创建了context并放入上下文的栈顶。

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 }
第一种场景:在自定义view对象的drawRect:方法中进行绘制

2在CALayer回调中进行绘制

   注意:回调方法给出了context,但是需要手动将context放入当前上下文的栈顶。

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 }
第二种场景:在CALayer回调中进行绘制

3通过自己创建一个context来绘图,通常用于对图片的处理。

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出创建的context18     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 }
第三种场景: 通过自己创建一个context来绘图,通常用于对图片的处理。

 

转载于:https://www.cnblogs.com/senlinwuran/p/5810794.html

你可能感兴趣的文章
关于Xshell无法连接centos6.4的问题
查看>>
css3动画——基本准则
查看>>
javaweb常识
查看>>
Java注解
查看>>
web自己主动保存表单
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>