Quartz 2D

1.什么是Quart 2D呢?

不知道,但是可以通过Quart2D绘制图形,自定义控件等等.

2.如何通过Quart 2D绘制图形和自定义控件?

有两种方式:C语言/OC;OC其实最后还是转换成C,那么用C会不会效率稍高?

3.基本图形的绘制

  • C语言方式

    • 获取当前图形上下文 :

          CGContextRef ctx = UIGraphicsGetCurrentContext();
    • 绘制图形:

      圆:CGContextRef _Nullable c:图形上下文; CGFloat x, CGFloat y:圆心坐标;CGFloat radius:半径;CGFloat startAngle:开始角度;CGFloat endAngle:结束角度;int clockwise:绘制的方向(顺时针还是逆时针)[CGContextAddArc(CGContextRef  _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise) ];
      椭圆:CGRect rect:一个矩形范围.[CGContextAddEllipseInRect(CGContextRef  _Nullable c, CGRect rect) ];
      线:(给定一些点,连接成线) const CGPoint * _Nullable points:CGPoint类型的数组;size_t count:有几个点[CGContextAddLines(CGContextRef  _Nullable c, const CGPoint * _Nullable points, size_t count) ];
      矩形:    [CGContextAddRect(CGContextRef  _Nullable c, CGRect rect) ];
      
      线:[CGContextMoveToPoint(CGContextRef  _Nullable c, CGFloat x, CGFloat y) ];[CGContextAddLineToPoint(CGContextRef  _Nullable c, CGFloat x, CGFloat y) ];
    • 渲染:填充/描边
    •   [CGContextStrokePath(CGContextRef  _Nullable c) ];//描边
        [CGContextFillPath(CGContextRef  _Nullable c) ];//填充
  • OC方式
    • 绘制
    • 圆:   [UIBezierPath bezierPathWithArcCenter:(CGPoint) radius:(CGFloat) startAngle:(CGFloat) endAngle:(CGFloat) clockwise:(BOOL)];
      矩形:  [UIBezierPath bezierPathWithRect:(CGRect)];
      
      圆角矩形:cornerRadius:(CGFloat):圆角实际上通过在矩形边角处绘制圆,然后将弧线外面部分截取掉实现的.此参数代表圆的半径,值越大,边角越圆
       [UIBezierPath bezierPathWithRoundedRect:(CGRect) cornerRadius:(CGFloat)];
      
      线:   UIBezierPath *path = [UIBezierPath bezierPath];//首先要获取UIBezierPath对象,调用对象方法画线   [path moveToPoint:(CGPoint)];   [path addLineToPoint:(CGPoint)];
    • 渲染
    •    UIBezierPath *path = [UIBezierPath bezierPath];
         [path fill];
         [path stroke];

 4.奇偶性原则

   有图形A,图形B,图形A,B有部分内容重合,设置使用奇偶性原则,设置填充模式,则重合次数为奇数次填充,偶数次不填充.

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddArc(ctx, 100, 100, 100, 0, M_PI * 2, 0);
    CGContextAddArc(ctx, 200, 100, 100, 0, M_PI * 2, 0);
    CGContextDrawPath(ctx, kCGPathEOFill);

增加一行代码,再多画一个圆:

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddArc(ctx, 100, 100, 100, 0, M_PI * 2, 0);
    CGContextAddArc(ctx, 200, 100, 100, 0, M_PI * 2, 0);
    CGContextAddArc(ctx, 150, 200, 100, 0, M_PI * 2, 0);
    CGContextDrawPath(ctx, kCGPathEOFill);

效果:

多出来的三角形:实际上多出来的三角形刚好是三个圆的起点.此种方式默认将图形的路径连接起来了.三角形部分同样遵守奇偶性原则.

OC实现同样的效果:

   UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    [path addArcWithCenter:CGPointMake(200, 100) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    [path addArcWithCenter:CGPointMake(150, 200) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    path.usesEvenOddFillRule = YES;

    [path fill];

那么如何才能设置奇偶性,同时又不让各个图形的路径连接起来呢?

OC实现:

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    UIBezierPath *path2 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 100) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    [path appendPath:path2];
    UIBezierPath *path3 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 200) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    [path appendPath:path3];
    path.usesEvenOddFillRule = YES;
    [path fill];

C实现方式:

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, 100, 100, 100, 0, M_PI * 2, 1);
    CGMutablePathRef path2 = CGPathCreateMutable();
    CGPathAddArc(path2, NULL, 200, 100, 100, 0, M_PI * 2, 1);
    CGMutablePathRef path3 = CGPathCreateMutable();
    CGPathAddArc(path3, NULL, 150, 200, 100, 0, M_PI * 2, 1);
    CGPathAddPath(path, NULL, path2);
    CGPathAddPath(path, NULL, path3);

    CGContextAddPath(ctx, path);
    CGContextDrawPath(ctx, kCGPathEOFill);

除了这些应该还有很多其他的实现方式.另外,我还是不理解直接直接绘制的方式和通过路径绘制的方有什么区别.

5.非零环绕数规则.

效果:

C实现方式:

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, 200, 200, 50, 0, M_PI * 2, 1);

    CGMutablePathRef path2 = CGPathCreateMutable();
    CGPathAddArc(path2, NULL, 200, 200, 100, 0, M_PI * 2, 0);

    CGMutablePathRef path3 = CGPathCreateMutable();
    CGPathAddArc(path3, NULL, 200, 200, 200, 0, M_PI * 2, 1);

    CGPathAddPath(path, NULL, path2);
    CGPathAddPath(path, NULL, path3);

    CGContextAddPath(ctx, path);
    CGContextDrawPath(ctx, kCGPathFill);

貌似纯OC代码不能实现,因为如果最后通过函数 CGContextDrawPath(ctx, kCGPathFill);渲染,就必须获取当前图形上下文.而如果不同过该函数渲染,纯OC貌似只有Fill,Stroke两种渲染方式.

  CGContextRef ctx = UIGraphicsGetCurrentContext();

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:50 startAngle:0 endAngle:M_PI * 2 clockwise:1];
    UIBezierPath *path2 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:0];
    UIBezierPath *path3 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:200 startAngle:0 endAngle:M_PI * 2 clockwise:1];

    CGContextAddPath(ctx, path.CGPath);
    CGContextAddPath(ctx, path2.CGPath);
    CGContextAddPath(ctx, path3.CGPath);

    CGContextDrawPath(ctx, kCGPathFill);

  

时间: 2024-12-24 01:47:05

Quartz 2D的相关文章

Quartz 2D 的一些使用

Quartz 2D是一个绘图框架,最近看了一下它的官方文档以及提供的的demo.看着这些资料自己做了一些小结. 1.线段的绘制 (绘制一条线段) //获取图像上下文 CGContextRef context = UIGraphicsGetCurrentContext(); //设置线条颜色 CGContextSetRGBStrokeColor(context, .5, .5, .5, 1); //设置线条宽度 CGContextSetLineWidth(context, 1); //设置起点 C

Quartz 2D编程指南(7) - 阴影(Shadows)

阴影是绘制在一个图形对象下的且有一定偏移的图片,它用于模拟光源照射到图形对象上所形成的阴影效果,如果7-1所示.文本也可以有阴影.阴影可以让一幅图像看上去是立体的或者是浮动的. 阴影有三个属性: 1.x偏移值,用于指定阴影相对于图片在水平方向上的偏移值. 2.y偏移值,用于指定阴影相对于图片在竖直方向上的偏移值. 3.模糊(blur)值,用于指定图像是有一个硬边(hard edge,如图7-2左边图片所示),还是一个漫射边(diffuse edge,如图7-1右边图片所示) 本章将描述阴影是如何

Quartz 2D Programming Guide

Quartz 2D Programming  Guide 官方文档: Quartz 2D Programming Guide 译文: Quartz 2D编程指南(1) - 概览 Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts) Quartz 2D编程指南(3) - 路径(Paths)[上] Quartz 2D编程指南(3) - 路径(Paths)[下] Quartz 2D编程指南(4) - 颜色和颜色空间 Quartz 2D编程指南(5) - 变换 Quar

iOS开发——图形编程OC篇&(六)Quartz 2D高级使用(二)

Quartz 2D高级使用 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息. 2.把绘图信息添加到路径里边. 以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部创建一个path用来保存绘图信息. 在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePathRef. 3.把路径

iOS开发——图形编程OC篇&(三)Quartz 2D绘图

绘图 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 决定绘制的输出目标(绘制到什么地方去?)(输出目标可以是PDF文件.Bitmap或者显示器的窗口上) 相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上. Quartz2D提供了以下几种类型的Graphics Context: Bitmap Graphics Context PDF Graphics

iOS开发——图形编程OC篇&(一)Quartz 2D介绍

Quartz 2D介绍 一.什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,??有各种各样的UI控件 UILabel:显?文字 UIImageView:显示图片 UIButton:同时显示图片和?字

Quartz 2D简介

1.Quartz 2D是一种二维绘图库,它与iphone OS紧密结合在一起,能协同所有相关框架进行工作,包括Core Animation.OpenGL ES和UIKit. 2.Quartz的绘图功能取决与3个核心概念:上下文.路径和状态. ①上下文(context):用户描述将图形写入哪里,该过程由CGContextRef定义.通常,可以写入UIView或位图中. ②路径:路径是那些经常在Quartz中绘制的内容.起初,他们是线段和弧的集合,随后通过描边或填充的方式绘制到屏幕中. ③状态:状态

Quartz 2D - 5.变换(Transforms)

Quartz 2D 绘制模型定义了两种独立的坐标空间:用户空间(用于表现文档页)和设备空间(用于表现设备的本地分辨率).用户坐标空间用浮点数表示坐标,与设备空间的像素分辨率没有关系.当我们需要一个点或者显示文档时, Quartz会将用户空间坐标系统映射到设备空间坐标系统.因此,我们不需要重写应用程序或添加额外的代码来调整应用程序的输出以适应不同的设备. 我们可以通过操作CTM(current transformation matrix)来修改默认的用户空间.在创建图形上下文后,CTM是单位矩阵,

Quartz 2D绘制简单图形

在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UIKit class QuartzView: UIView { // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance duri

IOS开发—Quartz 2D介绍

Quartz 2D学习记录 Quartz 2D简单介绍 一.什么是Quartz 2D Quarz 2D是一个二维绘画引擎,同时支持ios和mac,其API是Core Graphics框架的,是纯C语言的.IOS系统提供的大部分控件的内容都是通过Quartz 2D画出来的,因此Quartz 2D的一个很重要的价值是:自定义view(自定义UI控件). 二.一个重要的概念:图形上下文 图形上下文(Graphics context)是一个CGContextRef数据,其作用是: 保存绘图信息.绘图属性