【CoreGraphics】CGContext - 图形上下文(2 特殊处理)

一些方法

    // 本身的 操作
    CGContextRetain(context);
    CGContextRelease(context);
    CGContextFlush(context);
    CGContextSynchronize(context);

    BOOL pathEmpty = CGContextIsPathEmpty(context);// 路径是否为空
    
    CGPoint currentPoint = CGContextGetPathCurrentPoint(context);// 获取当前最后点
    
    CGRect boxRect = CGContextGetPathBoundingBox(context);// 包含路径的最小矩形
    
    CGPathRef path = CGContextCopyPath(context);// 获取路径
    
    BOOL contaninsPoint = CGContextPathContainsPoint(context, CGPointMake(50, 50), kCGPathFill);// 是否包含(多种包含模式可选)

2D 变化

 
-(void)drawRect:(CGRect)rect{
    CGContextRef context=UIGraphicsGetCurrentContext();
    
    //保存初始状态
    CGContextSaveGState(context);

    // 平移
    CGContextTranslateCTM(context, 100, 0);
    // 缩放
    CGContextScaleCTM(context, 0.8, 0.8);
    // 旋转
    CGContextRotateCTM(context, M_PI_4/4);
    // CGAffineTransform
    CGContextConcatCTM(context, CGAffineTransformMake(1, 1, 1, 1, 1, 1));
    // 获取 CGAffineTransform
    CGAffineTransform transform = CGContextGetCTM(context);
    
    
    // 绘图
    CGContextAddRect(context, CGRectMake(100, 400, 100, 100));
    CGContextSetFillColorWithColor(context, [[UIColor yellowColor] CGColor]);
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextDrawPath(context, kCGPathFillStroke);
    
    
    //恢复到初始状态
    CGContextRestoreGState(context);
}

裁剪区域

  • 环绕规则 CGContextClip
    如果边界是顺时针绘制,那么在其内部逆时针绘制的边界所包含的内容为空。如果边界是逆时针绘制,那么在其内部顺时针绘制的边界所包含的内容为空。

  • 奇偶规则 CGContextEOClip
    最外层的边界代表内部都有效,都要填充;之后向内第二个边界代表它的内部无效,不需填充;如此规则继续向内寻找边界线。我们的情况非常简单,所以使用奇偶规则就很容易了。这里我们使用CGContextEOCllip设置裁剪区域然后进行绘图。

  • 蒙板 CGContextClipToMask

  • 获取裁剪区域 CGContextGetClipBoundingBox(con)

    CGContextRef con = UIGraphicsGetCurrentContext();
    
    // 逆时针
    CGContextMoveToPoint(con, 0, 0);
    CGContextAddLineToPoint(con, 0, 200);
    CGContextAddLineToPoint(con, 200, 200);
    CGContextAddLineToPoint(con, 200, 0);
    CGContextAddLineToPoint(con, 0, 0);
    
    // 顺时针
    CGContextMoveToPoint(con, 50, 50);
    CGContextAddLineToPoint(con, 150, 50);
    CGContextAddLineToPoint(con, 150, 150);
    CGContextAddLineToPoint(con, 50, 150);
    CGContextAddLineToPoint(con, 50, 50);

    // 标记保存 裁剪前 状态
    CGContextSaveGState(con);
    

////////////////////////////// 关键 //////////////////////////////

    CGContextEOClip(con);// 奇偶规则
//    CGContextClip(con);// 环绕规则
//    CGContextClipToRect(con, CGRectMake(0, 0, 100, 100));// 范围内可见(可画)
//    CGContextClipToMask(con, CGRectMake(0, 0, 100, 100), alphaMask);// 蒙版,范围内 可见(可画)


//    CGRect rects[] = {CGRectMake(0, 0, 80, 80), CGRectMake(100, 100, 80, 80)};
//    CGContextClipToRects(con, rects, sizeof(rects)/sizeof(rects[0]));


////////////////////////////// 关键 //////////////////////////////

    NSLog(@"%@",NSStringFromCGRect(CGContextGetClipBoundingBox(con)));

 
    // 画 线:裁剪区域,无法绘制上去
    CGContextMoveToPoint(con, 0, 0);
    CGContextAddLineToPoint(con, 200, 200);
    
    
    // 下面就测试(画个框显示)
    CGContextMoveToPoint(con, 0, 0);
    CGContextAddLineToPoint(con, 0, 200);
    CGContextAddLineToPoint(con, 200, 200);
    CGContextAddLineToPoint(con, 200, 0);
    CGContextAddLineToPoint(con, 0, 0);

    CGContextMoveToPoint(con, 50, 50);
    CGContextAddLineToPoint(con, 50, 150);
    CGContextAddLineToPoint(con, 150, 150);
    CGContextAddLineToPoint(con, 150, 50);
    CGContextAddLineToPoint(con, 50, 50);

    
    // 绘制
    CGContextSetFillColorWithColor(con, [[UIColor yellowColor] CGColor]);
    CGContextSetStrokeColorWithColor(con, [UIColor blueColor].CGColor);
    CGContextDrawPath(con, kCGPathFillStroke);
    

    
    // 恢复到 裁剪前 状态(上面裁剪区域也能绘制了)
    CGContextRestoreGState(con);
    
    // 画线
    CGContextMoveToPoint(con, 0, 200);
    CGContextAddLineToPoint(con, 200, 0);

    NSLog(@"%@",NSStringFromCGRect(CGContextGetClipBoundingBox(con)));


    // 绘制
    CGContextSetFillColorWithColor(con, [[UIColor yellowColor] CGColor]);
    CGContextSetStrokeColorWithColor(con, [UIColor blueColor].CGColor);
    CGContextDrawPath(con, kCGPathFillStroke);
 

渐变色

gradienRef 查看渐变组件

    // 轴向渐变
    CGContextDrawLinearGradient(context,
                                gradienRef,
                                CGPointMake(0, 100),
                                CGPointMake(100, 100),
                                kCGGradientDrawsBeforeStartLocation);
    
    
    // 径向渐变
    CGContextDrawRadialGradient(context,
                                gradienRef,
                                CGPointMake(0, 100),
                                10,
                                CGPointMake(100, 100),
                                50,
                                kCGGradientDrawsBeforeStartLocation);


    /*
     typedef CF_OPTIONS (uint32_t, CGGradientDrawingOptions) {
     kCGGradientDrawsBeforeStartLocation = (1 << 0),  延时到开始之前
     kCGGradientDrawsAfterEndLocation = (1 << 1)      延时到结束之后
     0      不要延时时:写0
     };
     */

阴影

    // 颜色 阴影
    CGContextSetShadowWithColor(context, CGSizeMake(1, 1), 4, [UIColor redColor].CGColor);
    
    // 黑色 阴影
    CGContextSetShadow(context, CGSizeMake(1, 1), 4);

屏幕 设备与显示 转换

// 跟屏幕 2x,3x 有关

    CGAffineTransform transform = CGContextGetUserSpaceToDeviceSpaceTransform(context);

    CGPoint devicePoint = CGContextConvertPointToDeviceSpace(context, CGPointMake(0, 0));
    CGPoint userPoint = CGContextConvertPointToUserSpace(context, CGPointMake(0, 0));
    
    CGSize deviceSize = CGContextConvertSizeToDeviceSpace(context, CGSizeMake(100, 100));
    CGSize userSize = CGContextConvertSizeToUserSpace(context, CGSizeMake(100, 100));
    
    CGRect deviceRect = CGContextConvertRectToDeviceSpace(context, CGRectMake(100, 100, 100, 100));
    CGRect userRect = CGContextConvertRectToUserSpace(context, CGRectMake(100, 100, 100, 100));
    

·

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

推荐阅读更多精彩内容