Quazts 2D . 基本绘图

本文主要是设计 基本绘图 :

图片处理

文字处理

画圆形

画弧形

绘制直线虚线

平铺效果

// 文字效果

drawText2
drawText
画弧线或者圆弧
画线2.png
画线.png
矩形.png
#define  ScreenWidth [UIScreen mainScreen].bounds.size.width
#define  ScreenHeight [UIScreen mainScreen].bounds.size.height
 // Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // 1. 取出上下文——当前绘图的位置(设备)
    CGContextRef context = UIGraphicsGetCurrentContext();
    NSLog(@"%@", context);
//    图片效果
//    [self drawImage:context];
 //    [self drawText2 :context ];
//     [self drawText :context ];
//    [self drawArc:context ];
//       [self drawLine2   ];
//        [self drawLine ];
//    [self drawShapeRect];


}

#pragma mark - 绘图方法
#pragma mark 绘制图像
- (void)drawImage:(CGContextRef)context
{
    UIImage *image = [UIImage imageNamed:@"头像1.png"];
    
    // 提示:绘制之后,就无法改变位置,也没有办法监听手势识别
    // 在指定点绘制图像
//    [image drawAtPoint:CGPointMake(50, 50)];
 
    
    // 会在指定的矩形中拉伸绘制
//     [image drawInRect:CGRectMake(0, 0, ScreenWidth,  ScreenHeight)];
    
    // 在指定矩形区域中平铺图片
    [image drawAsPatternInRect:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
}

#pragma mark 绘制文字(中文竖排)
- (void)drawText2:(CGContextRef)context
{
    NSString *string = @"般若波罗蜜多心经";
    
    // 1. 获取字体
    NSLog(@"%@", [UIFont familyNames]);
    UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
    // 在指定点绘制字符串
    //    [string drawAtPoint:CGPointMake(50, 50) withFont:font];
    // 如果在UILabel中,可以将numbersOfLine设置为0,并且指定足够的高度即可
    CGRect rect = CGRectMake(290, 10, 30, 440);
     [[UIColor lightGrayColor]set];
//    UIRectFill(rect);
    
    [[UIColor redColor]set];
    /*
     在英文中通常使用按照单词换行的方式处理 NSLineBreakByWordWrapping
     
     提示,在对齐方式的枚举中
     a. NSTextAlignmentJustified 两端对齐
     b. NSTextAlignmentNatural
     以上两种对齐方式不能使用
     */
    [string drawInRect:rect withFont:font lineBreakMode:NSLineBreakByCharWrapping alignment:NSTextAlignmentCenter];
}


#pragma mark 绘制文字
- (void)drawText:(CGContextRef)context
{
    NSString *string = @"Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world ";
    
    // 1. 获取字体
    NSLog(@"%@", [UIFont familyNames]);
    UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
    // 在指定点绘制字符串
//    [string drawAtPoint:CGPointMake(50, 50) withFont:font];
    // 如果在UILabel中,可以将numbersOfLine设置为0,并且指定足够的高度即可
    CGRect rect = CGRectMake(50, 50, 210, 360);
    [[UIColor lightGrayColor]set];
    UIRectFill(rect);
    
    [[UIColor redColor]set];
    /*
     在英文中通常使用按照单词换行的方式处理 NSLineBreakByWordWrapping
     
     提示,在对齐方式的枚举中
        a. NSTextAlignmentJustified 两端对齐
        b. NSTextAlignmentNatural
     以上两种对齐方式不能使用
     */
    [string drawInRect:rect withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
}

#pragma mark 绘制圆弧
- (void)drawArc:(CGContextRef)context
{
    // 1. 设置路径
    /**
     1) context 上下文
     2) x,y 是圆弧所在圆的中心点坐标
     3) radius 半径,所在圆的半径
     4) startAngle endAngle 起始角度和截止角度 单位是弧度
        0度 对应是圆的最右侧点
     5) clockwise 顺时针 0 或者逆时针 1
     */
//    CGContextAddArc(CGContextRef cg_nullable c, CGFloat x, CGFloat y,
//                    CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
    CGContextAddArc(context, 160, 230, 100, -M_PI_4, M_PI_4, 0);
    
    // 2. 绘制圆弧
    CGContextDrawPath(context, kCGPathStroke);
}

#pragma mark 绘制圆形
- (void)drawShapeCicle
{
    // 1. 取出上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGRect rect = CGRectMake(50, 50, 200, 100);
    
    // 2. 设置路径
    UIRectFrame(rect);
    CGContextAddEllipseInRect(context, rect);
    
    // 3. 绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark 绘制矩形
- (void)drawShapeRect
{
    /**
     在程序开发中,无论肉眼看到的是什么形状的对象,其本质都是矩形的
     */
    CGRect rect = CGRectMake(50, 50, 200.0, 200.0);
    
    [[UIColor redColor]set];
    
    // 绘制实心矩形
    UIRectFill(rect);
    // 绘制空心矩形
    UIRectFrame(CGRectMake(50, 300, 100, 100));
}

#pragma mark 绘制直线2 - 使用默认的context进行绘图
- (void)drawLine2
{
    // 1. 获取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // 2. 设置当前上下文的路径
    // 1) 设置起始点
    CGContextMoveToPoint(context, 50, 50);
    // 2) 增加点
    CGContextAddLineToPoint(context, 200, 200);
    CGContextAddLineToPoint(context, 50, 200);
    // 3) 关闭路径
     CGContextClosePath(context);
    
    // 3 设置属性
    /*
     UIKit默认会导入Core Graphics框架,UIKit对常用的很多CG方法做了封装
     
     UIColor setStroke  设置边线颜色
     UIColor setFill    设置填充颜色
     UIColor set        设置边线和填充颜色
     */
    // 设置边线
//    [[UIColor redColor]setStroke];
    // 设置填充
//    [[UIColor blueColor]setFill];
    // 设置边线和填充
    [[UIColor greenColor]  setStroke];
    
    // 4 绘制路径,虽然没有直接定义路径,但是第2步操作,就是为上下文指定路径
    CGContextDrawPath(context, kCGPathStroke);
}

#pragma mark 绘制直线
- (void)drawLine
{
    // 提示,使用Ref声明的对象,不需要用*
    // 1. 获取上下文-UIView对应的上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // 2. 创建可变的路径并设置路径
    /**
     注意:当我们开发动画的时候,通常需要指定对象运动的路线,然后由动画方法负责实现动画效果
     
     因此,在动画开发中,需要熟练使用路径
     */
    CGMutablePathRef path = CGPathCreateMutable();
    // 划线->
    // 1) 设置起始点
    CGPathMoveToPoint(path, NULL, 50, 50);
    // 2) 设置目标点
    CGPathAddLineToPoint(path, NULL, 200, 200);
    CGPathAddLineToPoint(path, NULL, 50, 200);
    
    // 3) 封闭路径
    // a) 直接指定目标点
//    CGPathAddLineToPoint(path, NULL, 50, 50);
    // b) 使用关闭路径方法
    CGPathCloseSubpath(path);
    
    // 3. 将路径添加到上下文
    CGContextAddPath(context, path);
    
    // 4. 设置上下文属性
    /*
     设置线条颜色
     red  0 ~ 1.0  red / 255
     green 0 ~ 1.0 green / 255
     blue 0 ~ 1.0 blue / 255
     alpha 透明度 0 ~ 1.0 
        0 - 完全透明
        1.0 - 完全不透名
     
     提示:
        1) 在使用rgb颜色设置时,最好不要同时指定 rgb 和 alpha,否则会对性能造成一定影响
        2) 默认线条和填充颜色都是黑色
     */
    CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
    CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 1.0);
    
    // 设置线条宽度
    CGContextSetLineWidth(context, 5.0);
    // 设置线条的顶点样式
    CGContextSetLineCap(context, kCGLineCapRound);
    // 设置线条的连接点样式
    CGContextSetLineJoin(context, kCGLineJoinRound);
    // 设置线条的虚线样式
    /**
     虚线的参数
     
     context
     phase 相位,虚线起始的位置,通常使用0即可,从头开始画虚线
     lengths 长度的数组
     count lengths数组的个数
     */
    CGFloat lengths[2] = {20.0, 10.0};
    CGContextSetLineDash(context, 0.0, lengths, 2);
    
    // 5. 绘制路径
    /**
     kCGPathStroke: 画线(空心)
     kCGPathFill:   填充(实心)
     kCGPathFillStroke: 即画线又填充
     */
    CGContextDrawPath(context, kCGPathFillStroke);
    
    // 6. 释放路径
    CGPathRelease(path);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容