• 整理一下CoreGraphic和Quartz2D的知识(二)


    利用Quartz2D绘图的基本步骤

    •1. 获取与视图相关联的上下文对象
    –UIGraphicsGetCurrentContext
    •2. 创建及设置路径 (path)
    –2.1 创建路径
    –2.2 设置路径起点
    –2.3 增加路径内容……
    •3. 将路径添加到上下文
    •4. 设置上下文属性
    –边线颜色、填充颜色、线宽、线段连接样式、线段首尾样式、虚线样式…
    •5. 绘制路径
    •6. 释放路径
     
    什么是路径::?
    •路径定义了一条或者或多条形状或子路径
    •子路径可以包含一条或者多条直线或曲线
    •子路径也可以是一些简单的形状,例如线、圆形、矩形或者星型等
    •子路径还可以包含复杂的形状,例如地图轮廓或者涂鸦等
    •路径可以是开放的,也可以是封闭的;对于封闭路径可以空心的也可以是实心的
     
    下面写一些代码来看看效果~,注意下面写的函数需要在UIView类及其子类的drawRect:方法中调用,原因见上一篇
     
    #pragma mark 绘制一条直线
    - (void)drawLine
    {
        // 1. 获取当前图形上下文,就是要绘制到屏幕
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        // 2. 设置路径
        CGMutablePathRef path = CGPathCreateMutable();
        // 1) 移动到某一个点
        CGPathMoveToPoint(path, NULL, 100, 100);
        // 2) 增加一条直线
        CGPathAddLineToPoint(path, NULL, 200, 200);
        
        // 3. 将路径添加到上下文
        CGContextAddPath(context, path);
        
        // 4. 设置上下文
        // 1) 设置线条颜色
        CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
        
        // 5. 将上下文中的路径绘制出来
        CGContextDrawPath(context, kCGPathStroke);
        
        // 6. 释放路径
        CGPathRelease(path);
    }

    其实为了方便程序员进行开发,也可以直接使用上下文内置的路径进行绘图而不是用上下文+路径的方法

    // 1. 获取上下文
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        // 2. 设置上下文中的路径
        CGContextMoveToPoint(context, 100, 100);
        CGContextAddLineToPoint(context, 200, 200);
        CGContextAddLineToPoint(context, 100, 200);
    //    CGContextAddLineToPoint(context, 100, 100);
        // 关闭路径
        CGContextClosePath(context);

    // 设置边线颜色

        [[UIColor redColor] setStroke];

        // 设置填充颜色

        [[UIColor blueColor] setFill];

        // 同时设置边线和填充颜色

        [[UIColor greenColor] set];

        

        // 4. 绘制上下文

        CGContextDrawPath(context, kCGPathFillStroke);

    上面代码中,如果注释的那句打开而CGContextClosePath(context)被注释掉的话,绘画出一个三角形

    如果按照上面的代码来,也绘画出一个三角形---{CGContextClosePath(context)的功能是将该上下文目前画出的路径封闭起来}

    因为核心图形使用非常频繁,因此UIKit对于常用的绘图做了一定的封装

      CGContextDrawPath(context, kCGPathFillStroke);这句语句的第二个参数是指定绘图的模式,可以绘制异或的图像等等.例如如果有一块被path包含了好几次

    ,通过指定模式可以将这一块空出来,下面是集中模式及其解释

     4. 填充模式

     kCGPathFill            填充绘制,针对关闭的路径使用

     kCGPathStroke          绘制线条,无所谓路径是否关闭

     kCGPathFillStroke      填充并绘制线条

     kCGPathEOFill          异或填充,针对关闭路径使用

     kCGPathEOFillStroke    异或填充并画线

    下面的代码是画一个矩形

    CGRect rect = CGRectMake(100, 100, 200, 200);
        
        [[UIColor redColor] set];
        // 绘制实心矩形
        UIRectFill(rect);
        
        CGRect rect1 = CGRectMake(150, 150, 50, 50);
        
        [[UIColor blueColor] set];
        // 绘制空心举行
        UIRectFrame(rect1);

    下面的代码是画一个圆形

    CGContextRef context = UIGraphicsGetCurrentContext();
        
        // 在iOS中,如果要绘制圆形,需要先指定一个矩形
        // 绘制出来的圆形,是内切于该矩形的
        
        // 1. 指定绘制圆形外切的矩形
        CGRect rect = CGRectMake(100, 100, 150, 150);
        
        // 2. 添加圆形到上下文路径
        CGContextAddEllipseInRect(context, rect);
        
        // 3. 绘制圆形
        CGContextDrawPath(context, kCGPathFill);

    下面的代码是画质一条弧线

    - (void)drawArc
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        /**
         弧线参数:
         
         1)上下文
         2) x, y 弧线所在圆上的圆心
         3)半径
         4) 开始角度、结束角度,0度是圆形最右侧的点
         5) 顺时针:0 逆时针:1
         */
        CGContextAddArc(context, 160, 240, 100, 0, -M_PI_2, 0);
        
        // 3. 绘制圆形
        CGContextDrawPath(context, kCGPathFill);
    }

    下面的代码是将一张图片以绘制的方式展现在View上

    #pragma mark 绘制图像
    - (void)drawImage
    {
        // 提示:绘制的图像,只能看不能交互,相对而言,性能比UIImageView要高
        UIImage *image = [UIImage imageNamed:@"头像1"];
        
        // 1. 在指定坐标绘制
    //    [image drawAtPoint:CGPointMake(80, 80)];
        
        // 2. 在指定区域内拉伸绘制
    //    [image drawInRect:CGRectMake(100, 100, 150, 250)];
        
        // 3. 平铺绘制
        [image drawAsPatternInRect:self.bounds];
    }

    下面的代码是绘制文字,NSString可以直接调用方法,将文字绘制在view上

    #pragma mark 绘制文本
    - (void)drawText
    {
        NSString *text = @"床前明月光,疑是地上霜!";
    
        UIFont *font = [UIFont systemFontOfSize:17];
        NSDictionary *dict = @{NSFontAttributeName: font, NSForegroundColorAttributeName: [UIColor redColor]};
        
        // 以下方法在iOS7被废弃
    //    [text sizeWithFont:font constrainedToSize:CGSizeMake(100, 10000) lineBreakMode:NSLineBreakByCharWrapping];
        CGRect rect = [text boundingRectWithSize:CGSizeMake(20, 10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];
        
        rect.origin = CGPointMake(100, 20);
    
        // 给文本加一个背景颜色
        [[UIColor lightGrayColor] set];
        UIRectFill(rect);
        
        // 在iOS7中,所有文本绘制属性,均需要使用属性字典进行设置!
    //    [[UIColor redColor] set];
        [text drawInRect:rect withAttributes:dict];
    }

    上面的 NSFontAttributeName等可以实现文字样式的多样化,这些是在iOS6中定义的,但是在iOS7随着苹果设计的扁平化和简洁化才开始得以大量使用

    不光可以设定文字的颜色和大小,还金额一设置下划线等属性

  • 相关阅读:
    Git工作中用法(Gitlab)
    面试记录,不定时更新中。。。
    webservice 技术改进
    HTTP详解
    Git学习05 --分支管理02
    Git学习04 --分支管理
    链表判环问题
    k-选取问题
    图片与字符串(base64编码)的转化
    二叉堆与堆排序的简单实现
  • 原文地址:https://www.cnblogs.com/xyzaijing/p/3832767.html
Copyright © 2020-2023  润新知