CGContextRef所有属性,方法搞清

6D25F009-D4BA-4910-B37C-EAB07C4D11F4.png
我们想要在画布上面画东西,需要🖌️吧,来,我们看看我们的画笔
 
 设置绘制直线、边框时的线条宽度
 1.void CGContextSetLineWidth(CGContextRef__nullable c, CGFloat width)
 有画笔了,我不能只用一个画笔吧,应该有很多画笔让我选吧,快给我拿不同颜色的
 2.CGContextSetRGBStrokeColor(context,1,1,1,1.0);//画笔线的颜色
 都选好了,该我画了,我先来画条直线玩玩吧,我在那个地方画呢
 3.CGContextAddLines(ctx, point, 2);
 point是什么玩意,它就是我们需要画的位置,好了一切都准备好了,我要开始画了,不对我画在那个地方
 4.CGContextRef ctx =UIGraphicsGetCurrentContext();
 好像这次真的可以开工了
 CGContextRef ctx =UIGraphicsGetCurrentContext();
 CGContextSetLineWidth(ctx, 2.f);
 CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
 CGPoint point[2];
 point[0] =CGPointMake(10, 80);
 point[1] =CGPointMake(100, 80);
 CGContextAddLines(ctx, point, 2);
 怎么搞的我都弄好了,怎么没有线呢,是不是笔没有墨水啊,没写上去啊 
 5.CGContextDrawPath(ctx, kCGPathStroke); //根据坐标绘制路径
 这次果然有了,伊,kCGPathStroke这个是什么鬼,我把它拿出来瞅瞅
 6.typedef CF_ENUM (int32_t, CGPathDrawingMode) {
 kCGPathFill,//只有填充(非零缠绕数填充),不绘制边框  如图1
 kCGPathEOFill,//奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)如图2
 kCGPathStroke,        // 只有边框  如图3
 kCGPathFillStroke,    // 既有边框又有填充  如图4
 kCGPathEOFillStroke   // 奇偶填充并绘制边框  如图5
 };
 这个不错,我画好了还能帮我自动给我上色,我准备了那么多就让我画一个直线?来我要先画个圆玩玩,我要想想我要多大的圆,画在那个位置,开始画圆吧
 7.CGContextAddArc(CGContextRef cg_nullable c, CGFloat x, CGFloat y,
 CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
 // x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
 CGContextAddArc(ctx, 30, 30, 20, 0, 2 *M_PI, 0);
 CGContextDrawPath(ctx, kCGPathEOFillStroke); //根据坐标绘制路径
 呦呵,为什么中间的一坨是黑色啊,忘了准备给它上的色选色了
 8.CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
 这样一个很帅的圆就出现了,我想来个扇形玩玩,
 CGContextAddArc(ctx, 80, 80, 30, 0, M_PI_2, 1);
 CGContextDrawPath(ctx, kCGPathEOFillStroke); //根据坐标绘制路径
 一个方法而已,不好玩,来点有意思的好不好,画个三角玩玩
 9.CGPoint point3[3];
 
 point3[0] =CGPointMake(10, 120);
 point3[1] =CGPointMake(10, 150);
 point3[2] =CGPointMake(40, 120);
 CGContextAddLines(ctx, point3, 3);
 
 CGContextClosePath(ctx);把几个点封闭起来
 CGContextSetLineCap(ctx, kCGLineCapSquare);设置线段端点的绘制形状
 CGContextSetLineJoin(ctx, kCGLineJoinBevel);设置线条连接点的风格
 CGContextDrawPath(ctx, kCGPathStroke);
 我以为有什么神奇的呢,这不就是上面的方法嘛,不行来个矩形,
 10.CGContextFillRect(ctx, CGRectMake(50, 150, 30, 30));//填充颜色矩形,设置model是无效的
    CGContextStrokeRect(CGContextRef cg_nullable c, CGRect rect)//填充边框,设置model是无效的
    CGContextAddRect(ctx, CGRectMake(90, 150, 40, 40));//这个是都有效的
 你还别说,这分类分的还挺好,都给我们准备好样式了,这样的填充没意思,有没有渐变式的颜色填充呢?
 11.CGContextDrawLinearGradient(CGContextRef context,CGGradientRef gradient, CGPoint startPoint, CGPoint endPoint,CGGradientDrawingOptions options)
    gradient渐变颜色,startPoint开始渐变的起始位置,endPoint结束坐标,options开始坐标之前or开始之后开始渐变
 一脸懵逼,都是些什么参数啊,CGGradientRef按CGContextRef的思路,需要获取吧,问题是我们还没创建去哪获取啊,来创建一个再说
 12.CGGradientRef gradient =CGGradientCreateWithColorComponents(rgb, color, NULL, sizeof(color)/(sizeof(color[0])*4));
 rbb是什么鬼,又没创建
 13.CGColorSpaceRef rgb =CGColorSpaceCreateDeviceRGB();这一下没有要创建的了吧,搞个渐变那么费劲,不爽吧
     CGColorSpaceRef rgb =CGColorSpaceCreateDeviceRGB();
     
     CGFloat color[] ={
     1,1,1, 1.00,
     1,1,0, 1.00,
     1,0,0, 1.00,
     1,0,1, 1.00,
     0,1,1, 1.00,
     0,1,0, 1.00,
     0,0,1, 1.00,
     0,0,0, 1.00,
     
     };
     
     CGGradientRef gradient =CGGradientCreateWithColorComponents(rgb, color, NULL, sizeof(color)/(sizeof(color[0])*4));
     
     CGColorSpaceRelease(rgb);
     
     CGContextSaveGState(ctx);
     CGContextMoveToPoint(ctx, 220, 90);
     CGContextAddLineToPoint(ctx, 240, 90);
     CGContextAddLineToPoint(ctx, 240, 110);
     CGContextAddLineToPoint(ctx, 220, 110);
     CGContextClip(ctx);//context裁剪路径,后续操作的路径
     
     CGContextDrawLinearGradient(ctx, gradient,CGPointMake
     (220,90) ,CGPointMake(240,110),
     kCGGradientDrawsAfterEndLocation);
     CGContextRestoreGState(ctx);// 恢复到之前的context
 14. CGContextSaveGState(ctx),CGContextRestoreGState(ctx);// 恢复到之前的context这个又是什么鬼,听我慢慢絮叨,这个主要用于保存剪切的前后,剪切以后为了恢复原来的状态
    // 需要说明的是,CGContextSaveGState()函数保存的绘图状态,不仅包括当前坐标系统的状态,也包括当前设置的填充风格、线条风格、阴影风格等各种绘图状态。但 CGContextSaveGState()函数不会保存当前绘制的图形
    这个玩意条件限制真不少,费了那么大的劲,就让我弄个矩形,不甘心,来再弄个圆形玩玩
 15.    CGContextDrawRadialGradient(ctx, gradient, CGPointMake(200, 200), 0.0, CGPointMake(200, 200), 40, kCGGradientDrawsBeforeStartLocation);
    这个圆画的还不错,来个椭圆玩玩可好
 16. CGContextAddEllipseInRect(ctx, CGRectMake(160, 180, 60, 30));
    CGContextDrawPath(ctx, kCGPathFillStroke);
 和圆几乎差不多哦,突然感觉累了,再来俩个曲线结束
17.画贝塞尔曲线
二次曲线
CGContextMoveToPoint(ctx, 120, 300);//设置Path的起点
CGContextAddQuadCurveToPoint(ctx,190, 310, 120, 390);//设置贝塞尔曲线的控制点坐标和终点坐标
CGContextDrawPath(ctx, kCGPathFillStroke);
18.三次曲线函数
CGContextMoveToPoint(ctx, 200, 300);//设置Path的起点
CGContextAddCurveToPoint(ctx,250, 280, 250, 400, 280, 300);//设置贝塞尔曲线的控制点坐标和控制点坐标终点坐标
CGContextDrawPath(ctx, kCGPathFillStroke);  

来个⭐️玩玩

EDE01ABB-12FB-4E60-8D38-8955CFC5F05E.png
CGContextRef ctx =UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);
    CGContextSetLineWidth(ctx, 3);
    
    CGFloat lengths[] ={6,3};
    
    CGContextSetLineDash(ctx, 0,lengths, 2);
    
    CGContextSetStrokeColorWithColor(ctx, [UIColor yellowColor].CGColor);
    
    CGContextSetFillColorWithColor(ctx, [UIColor grayColor].CGColor);
    
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    
//    CGContextSetFlatness(ctx, 2);
//    CGContextSetLineCap(ctx, kCGLineCapRound);
//    CGContextSetMiterLimit(ctx, 0);
    
    CGPoint point[3];
    point[0]=CGPointMake(40, 100);
    point[1]=CGPointMake(120, 100);
    point[2]=CGPointMake(80, 130);
    
    CGContextAddLines(ctx, point, 3);
    CGContextClosePath(ctx);

    CGPoint point1[4];
    point1[0] =CGPointMake(56, 148);
    point1[1] =CGPointMake(80, 100-20*sqrt(2));
    point1[2] =CGPointMake(104, 148);
    point1[3] =CGPointMake(80, 130);
    
    CGContextAddLines(ctx, point1, 4);
    CGContextClosePath(ctx);
//    CGContextStrokePath(ctx);

//    CGFloat color[] ={
//        1,1,1, 1.00,
//        1,1,0, 1.00,
//    };
//    CGFloat color[12]={
//        248.0/255.0,86.0/255.0,86.0/255.0,1,
//        249.0/255.0,127.0/255.0,127.0/255.0,1,
//        1.0,1.0,1.0,1.0
//    };
    
    CGFloat color[] ={
//        1,0,0,1,//红
        0,1,0,1,//绿
        1,1,1,1};//蓝
    
    CGColorSpaceRef rgb  =CGColorSpaceCreateDeviceRGB();
    CGFloat locations[2] = {0,1};

    CGGradientRef gradient =CGGradientCreateWithColorComponents(rgb, color, locations, 2);
    
    CGColorSpaceRelease(rgb);
    CGContextClip(ctx);

    CGContextDrawLinearGradient(ctx, gradient, CGPointMake(40, 100), CGPointMake(120, 100), kCGGradientDrawsBeforeStartLocation);
    CGContextRestoreGState(ctx);

下面是关于果冻的动画的链接
果冻链接

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,049评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 一转眼,来北京已经三年了。这三年,一直数落着北京的不好,可是真正到了离别的时候,又开始对自己执意要放弃的东西莫名感...
    蓝国王灯阅读 289评论 0 1
  • 文|龙十五 昨天在言几又书店瞅到《有钱人和你想的不一样》连忙买了,坐下来一口气从头读到尾:为的是核对自己和书中作者...
    龙十五_阅读 1,757评论 7 24
  • 夜晚,电话响起的时候,公交堵在了三环路上的双井桥,而我正在最后一排张着嘴熟睡,迷迷糊糊的就按下了接听键。 简单的就...
    頁時弎未阅读 242评论 0 0