zoukankan      html  css  js  c++  java
  • iOS学习——Quartz2D学习之DrawRect

    Quartz2D学习之DrawRect

    本文以问答形式主要讲述Quartz2D的相关内容,参考内容是网上下载的学习视频资料。

    1、什么是Quartz2D?

      他是一个二维的绘图引擎,同时支持iOS和Mac系统 

    2、Quartz2D能完成的工作

      画基本线条,绘制文字,图片,截图,自定义UIView.

    3、Quartz2D在开发中的价值

      当我们的控件样式极其复杂时,可以把控件内部的结构给画出画,就是自定义控件.

    4、什么是图形上下文

    图形上下文是用来保存用户绘制的内容状态,并决定绘制到哪个地方的.

    用户把绘制好的内容先保存到图形上下文,

    然后根据选择的图形上下文的不同,绘制的内容显示到地方也不相同,即输出目标也不相同.

    5、上下文的类型有哪些? 

    图形上下文的类型有:

    Bitmap Graphics Context(位图上下文)

    PDF Graphics Context

    Window Graphics Context 

    Layer Graphics Context(图层上下文,自定义UIView取得上下文就是图层上下文.

    UIView之所以能够显示就是因为他内部有一个图层)

    Printer Graphics Context

    6.如何自定义UIView,步骤是什么? 

    首先得要有上下文,有了上下文才能决定把绘制的东西显示到哪个地方去.CGContextRef ctx = UIGraphicsGetCurrentContext();

    其次就是这个上下文必须得和View相关联.才能将内容绘制到View上面.在DrawRect方法方法里

    步骤:

    1.要先自定定UIView

    2.实现DrawRect方法

    3.在DrawRect方法中取得跟View相关联的上下文.

    4.绘制路径(描述路径长什么样).

    5.把描述好的路径保存到上下文(即:添加路径到上下文)

    6.把上下文的内容渲染到View

    7、DrawRect方法作用?什么时候调用.

    DrawRect作用:专用在这个方法当中绘图的.只有在这个方法当中才能取得跟View相关联的上下文.

    DrawRect是系统自己调用的, 它是当View显示的时候自动调用.

    8、画线(基本步骤描述) 

    //1.获取跟View相关联的上下文 
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //2.绘制路径
    UIBezierPath *path = [UIBezierPath bezierPath];
      //2.1设置起点
        [path moveToPoint:CGPointMake(10, 125)];
         //2.2添加一根线到某个点
        [path addLineToPoint:CGPointMake(200, 125)];
    //3.把路径添加到上下文
    CGContextAddPath(ctx,path.CGPath);
    //4.把上下文的内容渲染到View上面.
    CGContextStrokePath(ctx);

    9、 想要再添加一根线怎么办?

    第一种方法:重新设置起点,添加一根线到某个点,一个UIBezierPath路径上面可以有多条线.

    第二种方法:直接在原来的基础上添加线.把上一条的终点当做下一条线的起点.添加一根线到某个点直接在下面addLineToPoint:

    10、怎么样设置线的宽度,颜色,样式?

    设置这些样式,我们称为是修改图形上下文的状态.

    设置线宽:CGContextSetLineWidth(ctx, 20);

    设置线段的连接样式: CGContextSetLineJoin(ctx, kCGLineJoinRound);

    添加顶角样式:CGContextSetLineCap(ctx, kCGLineCapRound);

    设置线的颜色: [[UIColor redColor] setStroke];

    11、如何画曲线?

    画曲线方法比较特殊需要一个控制点来决定曲线的弯曲程度.画曲线方法为:

    //先设置一个曲线的起点
    [path moveToPoint:CGPointMake(10, 125)];
    //再添加到个点到曲线的终点.同时还须要一个controlPoint(控件点决定曲线弯曲的方法程序)
    [path addQuadCurveToPoint:CGPointMake(240, 125) controlPoint:CGPointMake(125, 10)];

    12、如何画矩形,圆角矩形?

    画矩形直接利用UIBezierPath给我们封装好的路径方法bezierPathWithRect:CGRectMake(x, y, width,height) 

    (x,y)点决定了矩形左上角的点在哪个位置
    (width,height)是矩形的宽度高度    

    圆角矩形的画法多了一个参数,cornerRadius, bezierPathWithRoundedRect: cornerRadius:

    cornerRadius它是矩形的圆角半径.

    通过圆角矩形可以画一个圆.当矩形是正方形的时候,把圆角半径设为宽度的一半,就是一个圆.

    bezierPathWithRoundedRect:CGRectMake(10, 100, 50, 50) cornerRadius:25

    13、如果画椭圆,圆?

         画椭圆的方法为:bezierPathWithOvalInRect:CGRectMake(x, y, width,height) 

    前两个参数(x,y)分别代码圆的圆心

    后面两个参数(width,height)分别代表圆的宽度,与高度.

         宽高都相等时,画的是一个正圆, 不相等时画的是一个椭圆

         bezierPathWithOvalInRect:CGRectMake(10, 100, 50, 50)

    14、如何利用渲染BezierPath对象的内容?

    当创建一个UIBezierPath对象之后,我们可以使用它的strokefill方法在current graphics context中去渲染它,这两个方法的底层的实现就是获取上下文拼接路径,把路径添加到上下文,渲染到View。在调用这些方法之前,我们要进行一些其他的任务去确保正确的绘制path,以及path的设置。
    使用UIColor类的方法去stroke和fill想要的颜色。
    使用strokefill方法进行渲染时,不需要我们手动去获取上下文了,这两个方法会自定获取view的上下文,然后在该view上绘制渲染path对应的路径,stroke是绘制线,fill是填充path对应的封闭区域。
    //设置矩形路径 path
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(10, 100, 50, 50)];
    //设置边框颜色
    [[UIColor greenColor] setStroke];
    //设置填充颜色
    [[UIColor redColor] setFill];
    //设置边框的线宽
    path.lineWidth = 5;
    //画边框
    [path stroke];
    //填充内部
    [path fill]; 

    15、如何画圆弧?

      首先要确定圆才能确定圆弧圆孤它就圆上的一个角度嘛还是使用UIBezierPath的自带的初始化方法。bezierPathWithArcCenter:(CGPoint) radius:(CGFloat) startAngle:(CGFloat) endAngle:(CGFloat) clockwise:(BOOL)

      center:圆心

            radius:圆的半径

            startAngle:起始角度

            endAngle:终点角度

            clockwise:Yes顺时针,No逆时针

    注意:startAngle角度的位置是从圆的最右侧为0度,即时钟的三点钟方向为起点

    //逆时针画一个半圆
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:M_PI clockwise:NO];
    [path stroke];
            
    //4分之1圆孤
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:-M_PI_2 clockwise:NO];
     [path stroke];

    16、如何画扇形

    扇形就是在圆弧的基础上进行填充,但是填充需要一个封闭的路径才能填充,所以画扇形的方法为:

    1.先画一个圆弧

    2.再添加一个一根线到圆心:

    3.然后封闭路径:[path closePath],该方法会自动从路径的终点到路径的起点封闭起来,形成一个封闭的路径

    4.最后进行填充:[path fill]; 

    //画1/4圆示例
    //画圆弧
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:-M_PI_2 clockwise:NO];
    //添加一根线到圆心
    [path addLineToPoint:CGPointMake(125, 125)];
    //关闭路径,从路径的终点到路径的起点
    [path closePath];
    //画扇形边框
    [path stroke];
    //用填充的话,它会默认做一个封闭路径,从路径的终点到起点. 
    [path fill];

     17、如何画饼图

      饼图就是多个扇形组成一个圆,所以其画法就是在,依次画每一部分,并设置每一部分的颜色和大小。

    - (void)drawRect:(CGRect)rect {
        //设置中心为当前视图的中心,饼状图的半径100
        CGPoint center = CGPointMake((rect.origin.x + rect.size.width/2),
                                     (rect.origin.y + rect.size.height/2));
        CGFloat radius = 100;
        //起始初始值为12点钟方向,角度为0,结束值为12点钟方向
        CGFloat startA = -M_PI/2;
        CGFloat angle = 0;
        CGFloat endA = -M_PI/2;
    
        NSArray *datas =  @[@25,@25,@50];
        //循环画每一部分的扇形
        for (NSInteger i = 0; i < datas.count; i++) {
            startA = endA;
            angle = datas[i].floatValue / 100 * M_PI * 2;
            endA = startA + angle;
            //描述路径
            UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
                                                                radius:radius
                                                            startAngle:startA
                                                              endAngle:endA
                                                             clockwise:YES];
            [path addLineToPoint:center];
            [path closePath];
            //颜色设置 随机生成颜色
            [[self randomColor] set];
            //填充颜色
            [path fill];
        }
    }
    
    /**
     随机颜色:alpha通道它的取值范围是0-255;
     OC里面的取值范围只能是0到1,把它 / 255.0就让它到这个范围了,
     arc4random_uniform(256)随机产生 0 - 255的数.
     颜色通道它的取值范围是0 到 255.
     所以说要把0 到 255转换成0 到 1
     直接是  0 ~ 255 / 255.0就可以了.
    
     @return
     */
    - (UIColor *)randomColor{
        CGFloat r = arc4random_uniform(256)/ 255.0;
        CGFloat g = arc4random_uniform(256)/ 255.0;
        CGFloat b = arc4random_uniform(256)/ 255.0;
        return [UIColor colorWithRed:r green:g blue:b alpha:1];
    }

     18、如何进行重绘?

      我们绘制扇形、进度条等每当需要改变对应某一部分的值时就需要进行重新绘制,而我们绘制这些信息的内容都是写在 - (void)drawRect:(CGRect)rect方法中,那么我们是否通过直接调用该方法进行重绘呢?答案是否定的drawRect方法是不能手动调用,因为在drawRect方法中进行绘制图形时需要获取到view的上下文,在前面我们不管是自己获取上下文,还是通过[path stroke]、[path fill]这些方法自动获取上下文,都是需要获取到view的上下文的, 而自己调用的,没有给drawRect方法传递上下文,所以在draw方法中拿不到上下文。系统在调用DrawRect方法时,会自动帮你创建一个跟View相关联的上下文,并且传递给它。

      解决办法:想要重绘,调用[self setNeedsDisplay]告诉系统重新绘制View,系统就会自动帮你调用drawRect方法,系统在调用drawRect方法,它会帮你创建上下文 

  • 相关阅读:
    [python subprocess学习篇] 调用系统命令
    linux dd命令创建一定大小的文件
    [linux time命令学习篇] time 统计命令执行的时间
    新建应用母版页的网页index.aspx,about.aspx,login.aspx
    MOSS母板页制作 学习笔记(一)
    SharePoint 2010顶部链接导航栏的详细操作
    使用SharePoint 2010 母版页
    SharePoint 2010 母版页制作的简单介绍
    在 SharePoint 2010 中访问数据
    牛刀小试、用SharePoint 实现请假管理功能
  • 原文地址:https://www.cnblogs.com/mukekeheart/p/9340570.html
Copyright © 2011-2022 走看看