1 这里是绘制一个图片
//开启图形上下文
UIGraphicsBeginImageContext(self.bounds.size);
//获得当前画板(上下文)
CGContextRef gc = UIGraphicsGetCurrentContext();
//创建CGMutablePathRef (实质是创建绘制路径)
CGMutablePathRef path = CGPathCreateMutable();
//绘制Path
CGRect rect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
// 起点
CGPathMoveToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect));
CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect));
CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect));
CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect));
CGPathCloseSubpath(path);
//绘制渐变
[self drawLinearGradient:gc path:path LeftColor:lefC CenterColor:centC RightColor:rigtC];
//注意释放CGMutablePathRef(实质是闭合路径)
CGPathRelease(path);
//从Context中获取图像,并显示在界面上(获取绘制的图片)
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
2 给绘制的图片加上渐变色
/**
绘制线性渐变
@param context <#context description#>
@param path <#path description#>
@param lefC <#lefC description#>
@param centC <#centC description#>
@param rigtC <#rigtC description#>
*/
- (void)drawLinearGradient:(CGContextRef)context path:(CGPathRef)path LeftColor:(UIColor)lefC CenterColor:(UIColor)centC RightColor:(UIColor*)rigtC
{
// 绘制背景渐变的
// CGColorSpaceCreateDeviceRGB 获得rgb色彩空间
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// 色彩得分梯度范围 (0-1) ,且呈现递增趋势
CGFloat locations[] = { 0.3,0.7,1.0};
// 颜色数组
NSArray *colors = @[(__bridge id) lefC.CGColor, (__bridge id) centC.CGColor,(__bridge id) rigtC.CGColor];
//创建渐变对象
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations);
// 根据绘制的路径绘制成的矩形的rect
CGRect pathRect = CGPathGetBoundingBox(path);
//具体方向可根据需求修改
// 方向只由两个点控制
CGPoint startPoint = CGPointMake(CGRectGetMinX(pathRect), CGRectGetMinY(pathRect));
CGPoint endPoint = CGPointMake(CGRectGetWidth(pathRect), CGRectGetHeight(pathRect));
// 拓展
// UIGraphicsPushContext: 压栈当前的绘制对象,生成新的绘制图层
// CGContextSaveGState: 压栈当前的绘制状态
// A.将context绘制状态参数上下文copy一份,保存在内存,以后更改的绘制状态不影响内存中的绘制状态
// CGContextSaveGState(context)
// B.将之前保存的绘制状态覆盖掉context的绘制状态,并将内存中的绘制状态释放
// CGContextRestoreGState(context);
// 大概意思就是保存当前的绘制状态吧
CGContextSaveGState(context);
//添加上下文和绘制路径
CGContextAddPath(context, path);
// 裁剪上下文
CGContextClip(context);
// 绘制线性的线变色
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
// 更新或者覆盖上下文
CGContextRestoreGState(context);
//释放色渐变
CGGradientRelease(gradient);
//释放色彩空间
CGColorSpaceRelease(colorSpace);
}