OC-绘制图形的一些简单练习

在UIView中,所有的绘制界面操作,都必须在drawRect:方法中进行操作.

- (void)drawRect:(CGRect)rect {
    
    
//    [self drawLine];
//    [self drawLine2];
//    [self drawRectangle];
//    [self drawCircle];
//    [self drawCurve];
//    [self drawImage];
//    [self drawText];
    
    
  }

绘制直线

第一种方法
- (void)drawLine {
    
    //1 获取当前的绘制图形上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //2 创建并且设置路径  可变路径
    CGMutablePathRef path = CGPathCreateMutable();
    //设置路径上的点
    //路径的起始点
    //path 需要添加起始点的可变路径
    //transform 坐标系变化
    CGPathMoveToPoint(path, NULL, 50, 50);
    
    //向路径中添加点
    CGPathAddLineToPoint(path, NULL, 100, 100);
    CGPathAddLineToPoint(path, NULL, 200, 100);
    CGPathAddLineToPoint(path, NULL, 100, 200);
    CGPathAddLineToPoint(path, NULL, 150, 50);
    CGPathAddLineToPoint(path, NULL, 50, 150);
    
    //封闭路径 将路径的终点和起始点链接
    CGPathCloseSubpath(path);

    //3 设置绘制属性 (线条颜色,线条粗细)
    //设置线段颜色
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    
    //设置图形的填充颜色
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
    
    //设置线条宽度
    CGContextSetLineWidth(context, 5);
    
    //设置线段连接点的样式
    CGContextSetLineJoin(context, kCGLineJoinRound);
    
    //4 绘制路径
    //将创建好的路径 添加到上下文中
    CGContextAddPath(context, path);
    //在图形上下文中绘制已添加路径
    //mode 绘制模式
    CGContextDrawPath(context, kCGPathFillStroke);
    

    //在CG框架中 所有使用到了create函数创建的变量,都需要手动销毁
    CGPathRelease(path);
    
}

一开始用的时候感觉这些方法挺难记的,因为是C语言的一套接口,在OC里面也不好直接查看方法.后来发现context的方法基本都是CGContext开头的,path的方法都是CGPath开头的...

第二种方法
- (void)drawLine2 {
    
    //第二种绘制线段的方法, 不需要使用路径
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //创建多个点 并且放入到数组中
    CGPoint point1 = CGPointMake(100, 100);
    CGPoint point2 = CGPointMake(150, 150);
    CGPoint point3 = CGPointMake(200, 150);
    CGPoint point4 = CGPointMake(150, 100);
    CGPoint point5 = CGPointMake(200, 100);
    CGPoint points[5] = {point1, point2, point3, point4, point5};
    
    //向上下文中添加线段
    CGContextAddLines(context, points, 5);
    
    CGContextSetLineWidth(context, 3);
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    //设置填充颜色 在UIKit框架中,对某些功能进行了简单封装
    //直接调用UIKit中的接口也能够完成一部分的绘制操作
    [[UIColor yellowColor] setFill];
    
    CGContextDrawPath(context, kCGPathEOFillStroke);
    
}

绘制矩形

- (void)drawRectangle {
    
    //创建一个矩形区域
    CGRect rect = CGRectMake(50, 50, 100, 50);
    
    //将rect添加到图形上下文中
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddRect(context, rect);
    
    //设定颜色
    [[UIColor redColor] setFill];
    [[UIColor yellowColor] setStroke];
    CGContextSetLineWidth(context, 3);
    
    CGContextDrawPath(context, kCGPathFillStroke);
    
}

绘制圆形

- (void)drawCircle {
    
    //获取当前的上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //添加一个圆形路径倒上下文中
    
    /**
     *  context  图形上下文
     *  x,y 圆心坐标点
     *  radius 半径
     *  angle 开始和结束的角度  0度在x轴正方向,角度沿顺时针方向增大
     *  clockwise 画的方向 0表示顺时针画圆,1表示逆时针画
     */
    CGContextAddArc(context, 100, 100, 50, 0, M_PI_2, 0);
    
    [[UIColor orangeColor] setStroke];
    [[UIColor purpleColor] setFill];
    CGContextSetLineWidth(context, 5);
    
    //绘制线条
    CGContextDrawPath(context, kCGPathFillStroke);
    
}

这里说明一下,CGContextAddArc这个函数到底是怎么画圆形的好像比较难理解,这里说说我的理解.X的正方向是0度,然后角度沿着顺时针变大.在上面的例子中CGContextAddArc(context, 100, 100, 50, 0, M_PI_2, 0),起始角度是0°也就是x正轴方向,然后结束角度是M_PI_2,也就是90°的位置,图形是起始位置向结束位置画的,clockwise是0也就是逆时针,所以最后画出来的图形是一个90的圆弧

绘制曲线

- (void)drawCurve {
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //设定曲线的起点
    CGContextMoveToPoint(context, 200, 100);
    //添加一条曲线到上下文
//    CGContextAddQuadCurveToPoint(context, 200, 500, 300, 100);
//    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
//    //绘制线条
//    CGContextDrawPath(context, kCGPathStroke);
//    
    
    //绘制贝赛尔曲线
    CGContextAddCurveToPoint(context, 100, 300, 300, 100, 200, 500);
    
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextDrawPath(context, kCGPathStroke);
    
}

绘制图形

- (void)drawImage {
    //读取图片
    UIImage *image = [UIImage imageNamed:@"001"];
    //方式一
    //将图片绘制到某一个位置,图片的大小不变
    [image drawAtPoint:CGPointMake(100, 100)];
    
    //方式二
    [image drawInRect:CGRectMake(100, 200, 200, 200) blendMode:kCGBlendModeDifference alpha:1];
}

绘制文本

- (void)drawText {
    //创建字符串对象
    NSString *text = @"Hello World !";
    
    /*
     文字颜色
     字体以及大小
     */
    UIFont *textFont = [UIFont boldSystemFontOfSize:18];
    UIColor *textColor = [UIColor greenColor];
    //构建参数字典
    NSDictionary *attr = @{NSFontAttributeName : textFont,
                           NSForegroundColorAttributeName : textColor};
    
    //绘制文字
    [text drawInRect:CGRectMake(100, 100, 200, 100) withAttributes:attr];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,701评论 2 10
  • Quartz 2D是二维图形绘制引擎,可以实现N多图形图像的操作功能,如基本路径的绘制、透明度、描影、绘制阴影、透...
    起名好难_fz阅读 414评论 0 2
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,455评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,089评论 5 13
  • 做为一位小学老师,应该去了解孩子们在该年龄阶段的心理特征,要站在孩子的角度去思考问题,这样才能更能有效的教育。 在...
    云淡风轻_823a阅读 554评论 0 0