quartz 2D 总结
CGContextRef ctx= UIGraphicsGetCurrentContext();
CGContextMoveToPoint(ctx,10, 10);
CGContextAddLineToPoint(ctx,100, 100);
绘制线段 画矩形可以让线段变粗 设置起点 然后设置后面的点
// Drawing code// 1.获得图形上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.拼接图形(路径)// 设置线段宽度CGContextSetLineWidth(ctx, 10);// 设置线段头尾部的样式CGContextSetLineCap(ctx, kCGLineCapRound);// 设置线段转折点的样式CGContextSetLineJoin(ctx, kCGLineJoinRound);/** 第1根线段 **/// 设置颜色CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);// 设置一个起点CGContextMoveToPoint(ctx, 10, 10);// 添加一条线段到(100, 100)CGContextAddLineToPoint(ctx, 100, 100);// 渲染一次CGContextStrokePath(ctx);/** 第2根线段 **/// 设置颜色CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);// 设置一个起点CGContextMoveToPoint(ctx, 200, 190);// 添加一条线段到(150, 40)CGContextAddLineToPoint(ctx, 150, 40);CGContextAddLineToPoint(ctx, 120, 60);// 3.渲染显示到view上面CGContextStrokePath(ctx);
画矩形 设置颜色的时候 2中状态 空心与实心 简便办法就是颜色直接set
// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画矩形CGContextAddRect(ctx, CGRectMake(10, 10, 150, 100));// set : 同时设置为实心和空心颜色// setStroke : 设置空心颜色// setFill : 设置实心颜色[[UIColor whiteColor] set];// CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);// 3.绘制图形CGContextFillPath(ctx);
画图片
// 1.取得图片UIImage *image = [UIImage imageNamed:@"me"];// 2.画
// [image drawAtPoint:CGPointMake(50, 50)];
// [image drawInRect:CGRectMake(0, 0, 150, 150)];[image drawAsPatternInRect:CGRectMake(0, 0, 200, 200)]; 平铺的画图
画文字
// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画矩形CGRect cubeRect = CGRectMake(50, 50, 100, 100); 确认字放在规定的矩形中CGContextAddRect(ctx, cubeRect);// 3.显示所绘制的东西CGContextFillPath(ctx);// 4.画文字NSString *str = @"哈哈哈哈Good morning hello hi hi hi hi";// [str drawAtPoint:CGPointZero withAttributes:nil];NSMutableDictionary *attrs = [NSMutableDictionary dictionary];// NSForegroundColorAttributeName : 文字颜色// NSFontAttributeName : 字体attrs[NSForegroundColorAttributeName] = [UIColor redColor];attrs[NSFontAttributeName] = [UIFont systemFontOfSize:50];[str drawInRect:cubeRect withAttributes:attrs]; <pre name="code" class="objc"><span style="white-space:pre"> </span>withAttributes 放一个可变字典
画圆弧
// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.画圆弧// x\y : 圆心// radius : 半径// startAngle : 开始角度// endAngle : 结束角度// clockwise : 圆弧的伸展方向(0:顺时针, 1:逆时针)CGContextAddArc(ctx, 100, 100, 50, M_PI_2, M_PI, 0);// 3.显示所绘制的东西CGContextFillPath(ctx);
怎么样在画第一个结束 不影响第二个
CGContextSaveGState(ctx);<pre name="code" class="objc">将ctx拷贝一份放到栈中 等于有2个存储点 这个存完以后 下一行代码销毁用过的备份
// 将栈顶的上下文出栈,替换当前的上下文CGContextRestoreGState(ctx);
// 1.获得上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 将ctx拷贝一份放到栈中CGContextSaveGState(ctx);// 设置绘图状态CGContextSetLineWidth(ctx, 10);[[UIColor redColor] set];CGContextSetLineCap(ctx, kCGLineCapRound);// 第1根线CGContextMoveToPoint(ctx, 50, 50);CGContextAddLineToPoint(ctx, 120, 190);CGContextStrokePath(ctx);// 将栈顶的上下文出栈,替换当前的上下文CGContextRestoreGState(ctx);// 第2根线CGContextMoveToPoint(ctx, 10, 70);CGContextAddLineToPoint(ctx, 220, 290);CGContextStrokePath(ctx);
// CGContextDrawPath(ctx, kCGPathStroke);
图形的缩放与移动(矩阵操作)
CGContextRef ctx = UIGraphicsGetCurrentContext();CGContextSaveGState(ctx);CGContextRotateCTM(ctx, M_PI_4 * 0.3); //在旋转CGContextScaleCTM(ctx, 0.5, 0.5);<span style="white-space:pre"> </span>//缩放CGContextTranslateCTM(ctx, 0, 150);<span style="white-space:pre"> </span>//上下移动CGContextAddRect(ctx, CGRectMake(10, 10, 50, 50));CGContextStrokePath(ctx);CGContextRestoreGState(ctx);CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 100));CGContextMoveToPoint(ctx, 100, 100);CGContextAddLineToPoint(ctx, 200, 250);CGContextStrokePath(ctx);
循环时间
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 默认1秒60次 适合1秒以下// [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];
//适合1秒以上
把某个控件单独拿出来用时 可以单独写入文件
CGContextRef ctx = UIGraphicsGetCurrentContext();// 1.先创建一个路径CGMutablePathRef linePath = CGPathCreateMutable();// 2.拼接路径CGPathMoveToPoint(linePath, NULL, 0, 0);CGPathAddLineToPoint(linePath, NULL, 100, 100);// 3.添加路径到上下文CGContextAddPath(ctx, linePath);CGMutablePathRef circlePath = CGPathCreateMutable();CGPathAddArc(circlePath, NULL, 150, 150, 50, 0, M_PI * 2, 0);CGContextAddPath(ctx, circlePath);// 4.渲染CGContextStrokePath(ctx);CGPathRelease(linePath);CGPathRelease(circlePath);CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();CGColorSpaceRelease(cs);
水印
+ (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo
{UIImage *bgImage = [UIImage imageNamed:bg];// 1.创建一个基于位图的上下文(开启一个基于位图的上下文)UIGraphicsBeginImageContextWithOptions(bgImage.size, NO, 0.0);// 2.画背景[bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)];// 3.画右下角的水印UIImage *waterImage = [UIImage imageNamed:logo];CGFloat scale = 0.2; //比例CGFloat margin = 5;<span style="white-space:pre"> </span>/间距CGFloat waterW = waterImage.size.width * scale;CGFloat waterH = waterImage.size.height * scale;CGFloat waterX = bgImage.size.width - waterW - margin;CGFloat waterY = bgImage.size.height - waterH - margin;[waterImage drawInRect:CGRectMake(waterX, waterY, waterW, waterH)];// 4.从上下文中取得制作完毕的UIImage对象UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();// 5.结束上下文UIGraphicsEndImageContext(); //begin开始 end结尾return newImage;
}
图片的裁剪
+ (instancetype)circleImageWithName:(NSString *)name borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor
{// 1.加载原图UIImage *oldImage = [UIImage imageNamed:name];// 2.开启上下文CGFloat imageW = oldImage.size.width + 2 * borderWidth;CGFloat imageH = oldImage.size.height + 2 * borderWidth;CGSize imageSize = CGSizeMake(imageW, imageH);UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);// 3.取得当前的上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 4.画边框(大圆)[borderColor set];CGFloat bigRadius = imageW * 0.5; // 大圆半径CGFloat centerX = bigRadius; // 圆心CGFloat centerY = bigRadius;CGContextAddArc(ctx, centerX, centerY, bigRadius, 0, M_PI * 2, 0);CGContextFillPath(ctx); // 画圆// 5.小圆CGFloat smallRadius = bigRadius - borderWidth;CGContextAddArc(ctx, centerX, centerY, smallRadius, 0, M_PI * 2, 0);// 裁剪(后面画的东西才会受裁剪的影响)CGContextClip(ctx);// 6.画图[oldImage drawInRect:CGRectMake(borderWidth, borderWidth, oldImage.size.width, oldImage.size.height)];// 7.取图UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();// 8.结束上下文UIGraphicsEndImageContext();return newImage;
}
屏幕截图
+ (instancetype)captureWithView:(UIView *)view
{// 1.开启上下文UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);// 2.将控制器view的layer渲染到上下文[view.layer renderInContext:UIGraphicsGetCurrentContext()];// 3.取出图片UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();// 4.结束上下文UIGraphicsEndImageContext();return newImage;
}
- (IBAction)clip {dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 1.捕捉UIImage *newImage = [UIImage captureWithView:self.view];// 2.写文件NSData *data = UIImagePNGRepresentation(newImage);NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"new.png"];[data writeToFile:path atomically:YES];});
}
quartz 2D 总结相关推荐
- Quartz 2D Programming Guide笔记
###Graphics Contexts图形上下文### 图形上下文(graphics context)是绘制目标,可以理解为画布,包含着绘图时的参数和设备信息.类型为CGContextRef.获取g ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS 2D绘图详解(Quartz 2D)之概述
原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 前言:最近在研究自定义控件,由于想要彻底的定制控件的视图还是要继承UIView ...
- Quartz 2d绘图
今天看了一下Quartz 2D绘图,我只想说:不要把绘图和动画那些东西当做一个很复杂的东西,其实只要你认真看还是可以理解的.他们并不难.啰嗦了几句,现在直接进入正题: 前提是我们必须新建一个singl ...
- iOS开发之Quartz 2D绘图
2019独角兽企业重金招聘Python工程师标准>>> Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境 Quartz 2D API可以实现许多功能,如 ...
- iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图
参考了An iOS 4 iPhone Graphics Drawing Tutorial using Quartz 2D这篇文章,用了30分钟在iPhone上画出了一条直线,核心代码全在drawRec ...
- 绘图与滤镜全面解析--Quartz 2D 、Core Image
绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2 ...
- Quartz 2D 涂鸦
转载自:http://blog.csdn.net/sinat_27706697/article/details/46041769 这一节,我将介绍使用Quartz 2D实现的一个实例 -- 涂鸦.在介 ...
- quartz c语言,IOS学习之—— Quartz 2D (C语言的框架)
//************************************************************************************************** ...
- 在iOS5中使用Quartz 2D创建PDF-第二部分
翻译自:How To Create a PDF with Quartz 2D in iOS 5 – Part 2 在第一部分,我们为PDF创建了框架,使用Quartz 2D绘制了基本的文字和线条. 由 ...
最新文章
- 认证概述散列函数数字签名
- Python—实训day7下—Pandas统计分析基础
- Attentive Sequence to Sequence Networks
- 移动端iphone抓包调试神器—Stream安装和使用(一)
- OFFICE拼写语法检查:全部忽略、全部更正的功能
- 影视剧中的歌曲怎么录制 怎么录背景音乐
- 【汇编】2、从汇编源码逐步分析函数调用过程
- 北大计算机就业报告,北京大学信息科学技术学院解读和毕业生就业统计
- myeclipse中设置括号匹配颜色
- 高德地图添加导航依赖冲突 com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
- 视频转语音,语音转文字
- 液晶屏及液晶模组英文行业术语
- Node.js接入支付宝(蚂蚁金服)支付
- CC00416.CloudKubernetes——|KuberNetesNetworkPolicy.V08|——|NetworkPolicy.v08|隔离中间件服务.v04|
- 次世代zbrush骷颅头高模雕刻 艺术头骨SP模型材质贴图讲解
- java runnable main_【BUG】”main” prio=5 tid=1 RUNNABLE
- Yura and Developers
- level 1与level 2的区别
- 基础 | 并发编程 - [LockSupport]
- 【沁恒CH32学习】——RISC-V架构学习笔记
热门文章
- JetPack Room数据库组件使用方式
- 偏微分方程:计算基本理论
- Kafka mirroring (MirrorMaker) 和 uReplicator 快速开始
- uni-app。APP-PLUS 获取应用缓存,缓存清除
- 树莓派TCP传输协议(socket通信) 一发一收与多发多收
- C 语言fseek, ftell调用失败(fseek返回非零值,ftell返回-1)
- C# Winfrom Excel表格导出 Aspose.Cells超简单方式
- 【linux命令】df和du的区别、文件系统
- 正则表达式切掉log日志前面不需要的内容
- sap 流程图 退货销售订单_销售订单_退货入库及退款(采用高级退货)