【原】iOS学习之Quartz2D(1)

摘要:
什么是Quartz2D?1.Quartz2D是一个二维绘图引擎,支持iOS和Mac系统。绘图状态决定绘图的输出目标(绘图到

什么是Quartz2D

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

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

  • 绘制图形 : 线条三角形矩形圆弧等

  • 绘制文字

  • 绘制生成图片(图像)

  • 读取生成PDF

  • 截图裁剪图片

  • 自定义UI控件

图形上下文

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

 2、图形上下文的作用:

  • 保存绘图信息、绘图状态

  • 决定绘制的输出目标(绘制到什么地方去?)

【原】iOS学习之Quartz2D(1)第1张

 相同的一套绘图序列,指定不同的 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];

  代码效果图:

【原】iOS学习之Quartz2D(1)第2张

 填充

    // 扇形
    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];

  代码效果图:

【原】iOS学习之Quartz2D(1)第3张

 5、圆角矩形

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

    [path stroke];

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

 代码效果图:

  【原】iOS学习之Quartz2D(1)第4张

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

免责声明:文章转载自《【原】iOS学习之Quartz2D(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇标定设备自动化-ASAP3php函数内不能访问函数外的变量原因下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

给HttpClient添加Socks代理

本文描述http client使用socks代理过程中需要注意的几个方面:1,socks5支持用户密码授权;2,支持https;3,支持让代理服务器解析DNS; 使用代理创建Socket 从原理上来看,不管用什么http客户端(httpclient,okhttp),最终都要转换到java.net.Socket的创建上去,看到代码: package java...

Tomcat热部署与热加载

Adblocker         Tomcat热部署与热加载 热部署和热加载是类似的,都是在不重启Tomcat的情况下,使得应用的最新代码生效。 热部署表示重新部署应用,它的执行主体是Host,表示主机。 热加载表示重新加载class,它的执行主体是Context,表示应用。 Tomcat中的后台线程 热部署和热加载都需要监听相应的文件或文件...

ASP.NET Core系列:中间件

1. 概述 ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码。 2.使用 IApplicationBuilder 创建中间件管道 2.1 匿名函数 使用Run, Map, Use ,MapWhen等扩展方法来实现。 usingMicrosoft.AspNetCore.Builder; usingMicrosoft.AspN...

歌词的获取

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_...

ASP.NET网站入侵第二波(LeaRun.信息化快速开发框架 已被笔者拿下)

笔者小学文化,语言组织能力差,写的不通的地方请大家将就着看,不喜勿喷。     上篇我讲了如何在上传文件中入侵服务器,這次我们稍微多讲一点。    还是先讲下流程: 1、上传代码页面  我上传的是ashx页面。 2、用ashx页面已文本形式显示web.Config的内容 得到数据库连接, 3、用ashx在网站根目录输出vbs脚本(创建Windows账户脚本...

SpringMVC源码阅读HandlerMapping初始化-AbstractHandlerMapping(五)

接口 public interface HandlerMapping { /** * 根据requst获得 对应的Handler * @param var1 * @return * @throws Exception */ Handl...