【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的优点 使用起来 ...
随机推荐
- Oracle 关于oracle自带的行转列函数
前言: 环境是java+hibernate+oracle11g 目标是将某表中根据id分组后将name字段的值拼接到一列中,且用“,“进行分割 试过用 wm_concat() 结合 group by ...
- Xcode控制台输出中文
创建一个.m文件,然后将一下代码加入.m文件中即可实现控制台输出中文,具体代码如下: #ifndef Release @implementation NSSet(Log) - (NSString *) ...
- Android MediaRecorder自定义分辨率
Android MediaRecorder自定义分辨率 工作这么久了,确实积累了不少东西,但都是以文档的形式存在U盘里的,为什么不写博客呢?因为懒啊!!!总感觉博客太难写了(大概是上学时候写作文恐惧症 ...
- springboot + sharding-jdbc 学习
官网地址:http://shardingsphere.io/document/current/cn/overview/ sharding-jdbc事务:https://blog.csdn.net/ya ...
- SSIS 无法在 unicode 和非 unicode 字符串数据类型之间转换
最近在学SSIS,遇到一个问题,把平面文件源的数据导入到EXCEL中. 平面文件源的对象是CSV,读进来的PhoneNumber是 DT_STR 然后倒入Excel 对应列建立的是longtext 一 ...
- 安卓手机USB无法共享、上网或卡顿的解决方法
安卓手机通过USB为电脑(Windows10)提供网络接入点时,系统程序会异常卡顿. 1)设备管理器2)点击“网络适配器”,在弹出的下拉列表中选择”Remote NDIS based Internet ...
- ROS和OpenCV的对接cv_bridge
做一个诚实的ROS教程搬运工............................. 官网链接:http://wiki.ros.org/cv_bridge 一.Package Summary Rel ...
- Lazarus开发环境编译选项配置
Lazarus的环境配置让人有点犯晕,对于刚从delphi转到lazarus上的我来说,每次新建工程都会遇到一堆Can't find unit xxxx used by xxxx的问题,问题虽然不大, ...
- Linux 之根目录介绍
1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...
- icheck使用
1.使用: <link rel="stylesheet" href="css/skins/all.css">或者<link rel=" ...