【原】iOS学习之Quartz2D(1)

什么是Quartz2D

1、Quartz 2D 是一个二维绘图引擎,同时支持iOS和Mac系统

2、Quartz 2D 能完成的工作:

  • 绘制图形 : 线条\三角形\矩形\圆\弧等
  • 绘制文字
  • 绘制\生成图片(图像)
  • 读取\生成PDF
  • 截图\裁剪图片
  • 自定义UI控件

图形上下文

1、图形上下文(Graphics Context):是一个 CGContextRef 类型的数据

2、图形上下文的作用:

  • 保存绘图信息、绘图状态
  • 决定绘制的输出目标(绘制到什么地方去?)

相同的一套绘图序列,指定不同的 Graphics Context,就可将相同的图像绘制到不同的目标上

3、Quartz2D 提供了以下几种类型的 Graphics Context

  • BitmapGraphics Context
  • PDFGraphics Context
  • WindowGraphics Context
  • LayerGraphics Context
  • PrinterGraphics Context

自定义view

1、如何利用 Quartz2D 绘制东西到 view 上?

  • 首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去
  • 其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面

2、自定义view的步骤

  • 新建一个类,继承自 UIView
  • 实现 - (void)drawRect:(CGRect)rect 方法,然后在这个方法中
    • 取得跟当前view相关联的图形上下文
    • 绘制相应的图形内容
    • 利用图形上下文将绘制的所有内容渲染显示到view上面

3、为什么要在 drawRect 里面绘图

  只有在这个方法里面才能获取到跟 View 的 layer 相关联的图形上下文

当这个View要显示的时候才会调用drawRect绘制图形

    注意:rect是当前控件的bounds

画线

1、步骤:

  • 获取图形上下文
  • 描述路径
  • 把路径添加到上下文
  • 渲染上下文

2、直线

 方式1:(最原始的绘图方式)

    // 1.获取图形上下文
    // 目前我们所用的上下文都是以UIGraphics
    // CGContextRef Ref:引用 CG:目前使用到的类型和函数 一般都是CG开头 CoreGraphics
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2.描述路径
    // 创建路径
    CGMutablePathRef path = CGPathCreateMutable();

    // 设置起点
    // path:给哪个路径设置起点
    CGPathMoveToPoint(path, NULL, 0, 250);

    // 添加一根线到某个点
    CGPathAddLineToPoint(path, NULL, 250, 0);

    // 3.把路径添加到上下文
    CGContextAddPath(ctx, path);

    // 4.渲染上下文
    CGContextStrokePath(ctx);

 方式2:(原生)

    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 描述路径
    // 设置起点
    CGContextMoveToPoint(ctx, 0, 0);

    CGContextAddLineToPoint(ctx, 250, 250);

    // 渲染上下文
    CGContextStrokePath(ctx);

 方式3:贝瑟尔路径

    // UIKit已经封装了一些绘图的功能
    // 贝瑟尔路径
    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPath];

    // 设置起点
    [path moveToPoint:CGPointMake(0, 125)];

    // 添加一根线到某个点
    [path addLineToPoint:CGPointMake(250, 125)];

    // 绘制路径
    [path stroke];

3、线的相关操作

 原生

    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 描述路径
    //起点
    CGContextMoveToPoint(ctx, 50, 50);

    CGContextAddLineToPoint(ctx, 100, 50);

    // 设置起点
    CGContextMoveToPoint(ctx, 80, 60);

    // 默认下一根线的起点就是上一根线终点
    CGContextAddLineToPoint(ctx, 100, 200);

    // 设置绘图状态,一定要在渲染之前
    // 颜色
    [[UIColor redColor] setStroke];

    // 线宽
    CGContextSetLineWidth(ctx, 5);

    // 设置连接样式
    CGContextSetLineJoin(ctx, kCGLineJoinBevel);

    // 设置顶角样式
    CGContextSetLineCap(ctx, kCGLineCapRound);

    // 渲染上下文
    CGContextStrokePath(ctx);

 贝瑟尔路径

    UIBezierPath *path = [UIBezierPath bezierPath];

    [path moveToPoint:CGPointMake(50, 50)];

    [path addLineToPoint:CGPointMake(200, 200)];

    // 线宽
    path.lineWidth = 10;
    // 颜色
    [[UIColor redColor] set];

    [path stroke];

    UIBezierPath *path1 = [UIBezierPath bezierPath];

    [path1 moveToPoint:CGPointMake(0, 0)];

    [path1 addLineToPoint:CGPointMake(30, 60)];
    [[UIColor greenColor] set];

    path1.lineWidth = 3;

    [path1 stroke];

 比较:

  从代码中可以看出,原生的线操作只能将线绘制为一种样式,但是贝瑟尔路径的对线的操作可以根据路径的不同来绘制不同样式的线条

3、曲线

 方式1(原生)

    // 原生绘制方法
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 描述路径
    // 设置起点
    CGContextMoveToPoint(ctx, 150, 50);

    // CGContextAddQuadCurveToPoint(CGContextRef cg_nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)
    // cpx:控制点的x
    // cpy:控制点的y
    // x, y 为线结束的点的坐标
    CGContextAddQuadCurveToPoint(ctx, 50, 50, 50, 150);

    // 渲染上下文
    CGContextStrokePath(ctx);

 方式2(贝瑟尔路径)

    // 圆弧
    // + (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
    // Center:圆心
    // radius:半径
    // startAngle:开始角度
    // endAngle:结束角度
    // clockwise:YES:顺时针 NO:逆时针

    CGPoint center = CGPointMake(125, 125);

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];

    [path stroke];

4、扇形

 未填充

    // 扇形
    CGPoint center = CGPointMake(125, 125);
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];

    // 添加一根线到圆心
    [path addLineToPoint:center];

    // 封闭路径,关闭路径:从路径的终点到起点
    [path closePath];

    [path stroke];

  代码效果图:

 填充

    // 扇形
    CGPoint center = CGPointMake(125, 125);
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];

    // 添加一根线到圆心
    [path addLineToPoint:center];

    // 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
    [path fill];

  代码效果图:

5、圆角矩形

    // 圆角矩形
    // + (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
    // cornerRadius:圆角的弧度,当值为边长的一半时,画出来的图像为圆形
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 200, 200) cornerRadius:50];

    [path stroke];

    // 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
//    [path fill];

 代码效果图:

  

  相关操作同贝塞尔路径的相关操作类似,大家可以试试,对以上内容有什么建议的可以直接联系我,O(∩_∩)O谢谢!

时间: 2024-10-16 19:47:35

【原】iOS学习之Quartz2D(1)的相关文章

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

ios学习总结--常用的字符串操作

本文总结一下我们常用的字符串的基本操作,在此与大家分享学习. 1.字符串的创建以及初始化 string:方法:创建字符串 NSString *str1 = [NSString string]; str1 = @"Test1"; stringWithstring:方法:用字符串来创建字符串 1 NSString *str2 = [NSString stringWithString:str1]; UTF8String:方法:NSString转换成C字符串 NSString *str2 =

iOS学习资源收集

https://github.com/Tim9Liu9/TimLiu-iOS 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.com/search 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 动画 侧滑与右滑返回手势 gif动画 其他动画 网络相关 网络连接 图像获取 网络

iOS学习笔记---oc语言第四天

字符串 数组 一.使用苹果帮助文档 学会使?用苹果帮助?文档是开发者的?一项技能 Inherits from 继承?自 Conforms to 遵循什么协议 Framework 属于哪个框架 Availability 什么时候可?用的 Declared in 声明在什么头文件?里 Related documents 相关文档 Sample code ?示例代码 快速打开帮助文档 在代码中,将?鼠标停留在 类名或者?法名上,option+?鼠标左键,点击 Reference的超链接进?入帮助?文档

iOS 学习参考资料

iOS 学习参考资料 ios 编程语言 Programming with Objective-C: About Objective-C : Apple 撰写的一份关于 Objective-C 2.0 的一份文档,这也算是学习 iOS/Mac 开发必读的一份文档,记得我当初看的时候是叫做 The Objective-C Programming Language. Learn Objective-C :这也是广受推荐的一份文档,短小精练,适合入门. Programming in Objective-

IOS学习笔记64--关于linker command failed with exit code错误

由于最近刚接手做静态库的同事的工作,这样难免的集成调试啊,但是集成之后老是出现linker command failed with exit code 1这个错误,查了许多资料,最后终于解决了,今天就这个问题做个探讨,以防止以后犯同样的错误,我先说下我这个项目里面错误的解决办法,然后再笼统的说下其他的解决办法.. 好,这是我出现  linker command failed with exit code错误的解决办法,也是出现这个错误的原因之一,静态库的响应路径不对. 好,下面就出现  link

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五) 五一劳动节马上来临,小伙伴有妹有很激动哟,首先祝天下所有的程序猿节日快乐!这个五一对于我来说有点不一样,我的人生从这个五一就转弯了,爱情长跑8年的我结婚了,一会支付宝账号我会公布出去,请自觉打款!谢谢合作. 灯光闪起来: 舞蹈跳起来: 歌曲唱起来: -------------------------------------------------------------------------------------

iOS学习笔记之UITableViewController&UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M