【iOS开发-80】Quartz2D画图简单介绍:直线/圆形/椭圆/方形以及上下文栈管理CGContextSaveGState/CGContextRestoreGState
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpc3ViYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
- (void)drawRect:(CGRect)rect {
//获得当前上下文
CGContextRef ctx=UIGraphicsGetCurrentContext();
//把当前上下文状态保存在栈中
CGContextSaveGState(ctx);
//缩放、移动处理(须要放在画图之前进行设置)
CGContextScaleCTM(ctx, 0.5, 0.5);
CGContextTranslateCTM(ctx, 100, 100);
CGContextRotateCTM(ctx, M_PI_4);
//描点
CGContextMoveToPoint(ctx, 10, 10);
CGContextAddLineToPoint(ctx, 100, 100);
CGContextAddLineToPoint(ctx, 150, 50);
//下面两种方式均可闭环
//CGContextAddLineToPoint(ctx, 10, 10);
CGContextClosePath(ctx);
//渲染画图,实心和空心
CGContextStrokePath(ctx);
//CGContextFillPath(ctx);
//把当前上下文状态保存在栈中
CGContextSaveGState(ctx);
//画正方形
CGContextAddRect(ctx, CGRectMake(100, 100, 50, 50));
//设置线宽(一定要在CGContextStrokePath之前)
//由于之前有过一次渲染画图,所以这个属性设置不影响上面的那个三角形,下面颜色设置同理
//所以,假设想分别设置两个或多个图形的属性,就分别渲染画图一次
CGContextSetLineWidth(ctx, 10);
//设置颜色(同理。属性设置的代码都要在画图的代码之前)
CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);
CGContextStrokePath(ctx);
//设置样式
CGContextMoveToPoint(ctx, 20, 160);
CGContextAddLineToPoint(ctx, 200, 280);
CGContextAddLineToPoint(ctx, 250, 200);
CGContextSetLineWidth(ctx, 20);
//设置头尾样式
CGContextSetLineCap(ctx, kCGLineCapRound);
//设置转角样式
CGContextSetLineJoin(ctx, kCGLineJoinRound);
CGContextStrokePath(ctx);
//把保存在栈中的上下文状态取出来,恢复。
上面那段代码设置的样式不会影响其它
CGContextRestoreGState(ctx);
//画椭圆
CGContextAddEllipseInRect(ctx, CGRectMake(200, 130, 60, 30));
//下面等价
//CGContextStrokePath(ctx);
CGContextDrawPath(ctx, kCGPathStroke);
//画圆形
CGContextAddEllipseInRect(ctx, CGRectMake(140, 170, 50, 50));
CGContextSetLineWidth(ctx, 3);
CGContextStrokePath(ctx);
//画圆弧
CGContextAddArc(ctx, 200, 50, 50, M_PI_4, M_PI, 1);
CGContextStrokePath(ctx);
//画1/4圆,以及颜色的设置新方法
CGContextMoveToPoint(ctx, 10, 230);
CGContextAddLineToPoint(ctx, 10, 280);
CGContextAddLineToPoint(ctx, 60, 280);
CGContextAddArc(ctx, 10, 280, 50, 0, -M_PI_2, 1);
[[UIColor greenColor] setStroke];
CGContextStrokePath(ctx);
//画图片和文字(不须要手动取得上下文)
NSString *str1=@"辛丑年一空作";
[str1 drawAtPoint:CGPointZero withAttributes:nil];
UIImage *img=[UIImage imageNamed:@"001"];
[img drawAtPoint:CGPointMake(10, 10)];
//在一个框框里重叠图片并署名
CGRect rect1=CGRectMake(50, 50, 100, 100);
[img drawAsPatternInRect:rect1];
NSMutableDictionary *attr=[[NSMutableDictionary alloc]init];
attr[NSForegroundColorAttributeName]=[UIColor whiteColor];
attr[NSFontAttributeName]=[UIFont systemFontOfSize:13];
[str1 drawInRect:CGRectMake(50, 140, 100, 100) withAttributes:attr];
//把保存在栈中的上下文状态取出来,恢复。上面那段代码设置的样式不会影响其它
CGContextRestoreGState(ctx);
//裁剪圆形头像
CGContextAddEllipseInRect(ctx, CGRectMake(150, 150, 100 , 100));
//依照圆形剪裁出一个上下文区域,以后的内容就填充在这个圆形上下文中
CGContextClip(ctx);
UIImage *img1=[UIImage imageNamed:@"me"];
[img1 drawAtPoint:CGPointMake(150, 150)];
}
【iOS开发-80】Quartz2D画图简单介绍:直线/圆形/椭圆/方形以及上下文栈管理CGContextSaveGState/CGContextRestoreGState的更多相关文章
- 【iOS开发-80】Quartz2D绘图简介:直线/圆形/椭圆/方形以及上下文栈管理CGContextSaveGState/CGContextRestoreGState
本文转载至 http://blog.csdn.net/weisubao/article/details/41282457 - (void)drawRect:(CGRect)rect { //获得当前上 ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- iOS开发UI篇—Modal简单介绍
iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- iOS开发UI篇—Kvc简单介绍
ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...
- iOS开发UI篇—UIWindow简单介绍
iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...
- iOS开发多线程篇—NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS开发数据库篇—FMDB简单介绍
iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...
随机推荐
- 工具分享2:Python 3.6.4、文本编辑器EditPlus、文本编辑器Geany
工具官网下载地址: https://www.python.org/downloads/ python 3.6.0下载链接: 链接:https://pan.baidu.com/s/1snuSxsx 密码 ...
- Activity生命周期(待整理)
1. 定义 有一些方法共同定义生命周期,如下图示:(图片来自于官网文档) 2. onStart()——在Activity即将对用户可见之前调用 (1)Activity启动动画.二维动画在onStart ...
- SharedPreferences用法
SharedPreferences是Android四种数据存储技术中的一种,它是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信 息,其对 ...
- ajax 三级联动写法
主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Hbase 简单记录
进入hbase 客户端命令行: hbase shell 根据rowkey获取单条数据: get 'HXXT_ns:app_test_hbase', 'rowkey值' 范围查询,并指定数据量: s ...
- Deutsch lernen (15)
1. unterscheiden - unterschied - unterschieden 区别,区分:(能够)分清 Die beiden Begriffe sind nur schwer ...
- Matlab矩阵填充--Matlab interp2
Matlab interp2 为Matlab的矩阵填充函数, 填充关系: x=1:11; y=1:13; x1=1:0.1:12; y1=1:0.1:14; [x2,y2]=meshgrid(x1,y ...
- 使用std::cout不能输出显示
在测试一行函数时,出现std::cout不能输出的情况,找不到原因. 1. 只好从main函数第一行,开始测试,直到发现一个函数 o_Initer.ekf_filter(filter, ...
- Android读写文件
1.从resource中的raw文件夹中获取文件并读取数据(资源文件只能读不能写) String res = ""; try{ InputStream in = getResour ...
- react基础篇五
再看JSX 本质上来讲,JSX 只是为 React.createElement(component, props, ...children) 方法提供的语法糖.比如下面的代码: <MyButto ...