一些方法
// 本身的 操作
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));
·