【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的优点 使用起来 ...
随机推荐
- APP加固反调试(Anti-debugging)技术点汇总
0x00 时间相关反调试 通过计算某部分代码的执行时间差来判断是否被调试,在Linux内核下可以通过time.gettimeofday,或者直接通过sys call来获取当前时间.另外,还可以通过自定 ...
- 辨析 singleton 和 prototype
<bean id="person1" class="com.bean.life.Person"> <property name="n ...
- ROS-TF-监听
前言:监听第一只海龟的位置,然后让第二只海龟跟随第一只海龟. 通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息. 一.新建cpp文件 新建turtle_tf_listene ...
- 自学Python四 爬虫基础知识储备
首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏 和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...
- sphinx在windows下的简单安装与使用
1.下载地址 http://sphinxsearch.com/downloads/release/,我这里下的是“Win64 binaries w/MySQL+PgSQL+libstemmer+id6 ...
- 三维重建面试0:*SLAM滤波方法的串联综述
知乎上的提问,高翔作了回答:能否简单并且易懂地介绍一下多个基于滤波方法的SLAM算法原理? 写的比较通顺,抄之.如有异议,请拜访原文.如有侵权,请联系删除. 我怎么会写得那么长--如果您有兴趣可以和我 ...
- numpy安装失败-小失误
1. 古老的方法: 安装python numpy库AMD64 失败,网上的教程是这样的:http://www.cnblogs.com/zhuyp1015/archive/2012 ...
- java 发送http请求
参考别人的 package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...
- Bootstrap 模态框(Modal)带参数传值实例
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 为了实现父窗体与其的交互,通常需要向其传值,实现 ...
- Vuex教程简单实例
什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...