zoukankan      html  css  js  c++  java
  • iOS高级-QuartzCore框架-2D绘图-实例:小黄人

    #define MJColor(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] 

    1.自定义一个MJHumanView,默认View的Class设置为MJHumanView
    2.实现drawRect:方法

    -(void)drawRect:(CGRect)rect
    {
    //1.上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    //2.身体
    drawBody(ctx,rect);
    
    //3.嘴(微笑)
    drawMouth(ctx,rect);
    
    //4.画眼睛
    drawEyes(ctx,rect);
    }

    二、画身体

    //画身体
    void drawBody(CGContextRef ctx,CGRect rect)
    {
    //上半圆
    CGFloat topX = rect.size.width *0.5;
    CGFloat topY = MJTopY;
    CGFloat topRadius = MJRadius; //半径因为经常要用,所以设为宏
    CGContextAddArc(ctx,topX,topY,topRadius,0,M_PI,1);
    
    //向下延伸
    CGFloat middleX = topX - topRadius;
    CGFloat middleH = 100//中间的身体长度
    CGFloat middleY = topY + middleH;
    CGContextAddLineToPoint(ctx,middleX,middleY);
    
    //下半圆
    CGFloat bottomX = topX;
    CGFloat bottomY = middleY;
    CGFloat bottomRadius = topRadius;
    CGContextAddArc(ctx,bottomX,bottomY,bottomRadius,M_PI,01); 
    
    
    //合并路径
    CGContextClosePath(ctx);
    
    //设置颜色(写成了宏)
    [MJColor(2522180set];
    //利用填充方式画出之前的路径
    CGContextFillPath(ctx);
    }

    三、画嘴巴

    void drawMouth(CGContextRef ctx,CGRect rect)
    {
    //中间的控制点
    CGFloat controlX = rect.size.width * 0.5;
    CGFloat controlY = rect.size.height * 0.4//当前点
    CGFloat marginX = 20//控制点与2点在X方向上的间距,越大则越长
    CGFloat marginY = 10//控制点与2点在Y方向上的间距,越大则越尖
    CGFloat currentX = controlX - marginX;
    CGFloat currentY = controlY - marginY; 
    CGContextMoveToPoint(ctx,currentX,currentY);
    
    //结束点
    CGFloat endX = controlX + marginX;
    CGFloat endY = currentY;
    
    //贝塞尔曲线
    CGContextAddQuadCurveToPoint(controlX,controlY,endX,endY);
    
    //设置颜色
    [[UIColor blackColor] set];
    //渲染
    CGContextStrokePath(ctx);
    }

    四、画眼睛

    void drawEyes(CGContextRef ctx,CGRect rect)
    {
    //1.画黑色绑带
    CGFloat startX = rect.size.width * 0.5 - MJRadius;
    CGFloat startY = MJTopY;
    CGContextMoveToPoint(ctx,startX,startY);
    CGFloat endX = start +2 * MJRadius;
    CGFloat endY = startY;
    CGContextAddLineToPoint(ctx,endX,endY);
    CGContextSetLineWidth(ctx,15);
    [[UIColor blackColor] set];
    //绘制线条
    CGontextStrokePath(ctx);
    
    //2.画最外圈的镜框
    [MJColor(61,62,66set];
    CGFloat frameRadius = MJRadius * 0.4;
    CGFloat frameY = startY;
    CGFloat frameX = rect.size.width * 0.5 - MJRadius;
    CGContextAddArc(ctx,frameX,frameY,frameRadius,0,M_PI * 20); 
    
    CGContextFillPath(ctx);
    
    //3.画里面的白色框
    [[UIcolor whiteColor] set];
    CGFloat whiteRadius = frameRadius * 0.7;
    CGFloat whiteY = frameY;
    CGFloat whiteX =frameX;
    CGContextAddArc(ctx,whiteX,whiteY,whiteRadius,0,M_PI * 20); 
    
    CGContextFillPath(ctx);
    
    //眼珠同理
    }
  • 相关阅读:
    文件名中含有空格读取时产生的异常
    R 常用清洗函数汇总
    Fluid 0.4 新版本正式发布:支持数据预热,优化小文件场景
    阿里云 Serverless 再升级,从体验上拉开差距
    Dubbo-go 源码笔记(二)客户端调用过程
    高质量的缺陷分析:让自己少写 bug
    微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现
    OpenYurt 深度解读:如何构建 Kubernetes 原生云边高效协同网络?
    在大规模 Kubernetes 集群上实现高 SLO 的方法
    双十一购物节,Nacos 1.4.0 + Go SDK 1.0.1发布
  • 原文地址:https://www.cnblogs.com/marshall-yin/p/4747569.html
Copyright © 2011-2022 走看看