【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));
    

·

你可能感兴趣的:(【CoreGraphics】CGContext - 图形上下文(2 特殊处理))