颜色的渐变填充可以使用Quartz 2D来绘制,而Quartz 2D也是跨平台的,在iOS和Mac OS都可以使用,Quartz 2D的渐变方式分为两种:
a.线性渐变线:渐变色以直线方式从开始位置逐渐向结束位置渐变
b.径向渐变:以中心点为圆心从起始渐变色向四周辐射,直到终止渐变色
要做渐变则必须先设置从开始位置到结束位置的渐变颜色,需要在指定位置指定不同的颜色,剩下的事情交给系统处理即可。
另外,在iOS中绘制渐变还需要注意一点就是指定颜色空间,所谓颜色空间就是不同颜色在不同的维度上取值最终组成一种颜色的过程。就拿RGB来说,如果将红色、绿色、蓝色看成是x、y、z轴坐标系,那么在三个坐标上分别取0~255范围内的不同值则可以组成各类颜色。当然,不同颜色空间的“坐标系”也是不同的(也就是说颜色表示的方式是不同的),常用的颜色空间除了RGB还有CMYK(印刷业常用这种颜色模式)、Gray。使用Quartz 2D绘图时我们的颜色除了使用常规的方法(CGContextSetRGBFillColor(CGContextRef context, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)方法)设置RGB和透明度外,还有颜色参数是一个数组的情况。例如使用颜色空间填充时用到的CGContextSetFillColor(CGContextRef context, const CGFloat *components)方法,这个时候components数组中具体是如何存储颜色就要根据颜色空间而定,如果颜色空间使用RGB则数组中的元素四个为一组,分别是red(红)、green(绿)、blue(蓝)、alpha(透明度);如果使用CMYK颜色空间,那么数组中的元素五个为一组,分别是cyan(青)、magenta(洋红)、yellow(黄)、black(黑)、alpha(透明度)。
接下来直接上代码,看一下效果。
//Only override drawRect: if you perform custom drawing.
//An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
if (self.type == GradientTypeNone) {
return;
}
CGContextRef context=UIGraphicsGetCurrentContext();
if (self.type == GradientTypeLinear) {
[self drawLinearGradient:context];
}else if(self.type == GradientTypeCircle) {
[self drawRadialGradient:context];
}
}
#pragma mark - 线性渐变
-(void)drawLinearGradient:(CGContextRef)context{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //rgb 颜色空间
// space 颜色空间 ; compoents rgb颜色色值, 四个数组元素表示一个颜色(red、green、blue、alpha);locations 颜色渐变的区域 0~0.3有第一种颜色渐变为第二种颜色 0.3~1.0由第二种颜色渐变为白色;count 为渐变的个数
CGFloat compoents[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 locations[3]={0,0.3,1.0};
CGGradientRef gradient= CGGradientCreateWithColorComponents(colorSpace, compoents, locations, 3);
/*绘制
context:图形上下文
gradient:渐变色
startPoint:起始位置
endPoint:终止位置
options:绘制方式,kCGGradientDrawsBeforeStartLocation 开始位置之前就进行绘制,到结束位置之后不再绘制,
kCGGradientDrawsAfterEndLocation开始位置之前不进行绘制,到结束点之后继续填充
*/
CGContextDrawLinearGradient(context, gradient, CGPointZero, CGPointMake(320, 50), kCGGradientDrawsAfterEndLocation);
//释放颜色空间
CGColorSpaceRelease(colorSpace);
}
#pragma mark 径向渐变
-(void)drawRadialGradient:(CGContextRef)context{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //rgb 颜色空间
// space 颜色空间 ; compoents rgb颜色色值, 四个数组元素表示一个颜色(red、green、blue、alpha);locations 颜色渐变的区域 0~0.3有第一种颜色渐变为第二种颜色 0.3~1.0由第二种颜色渐变为白色;count 为渐变的个数
CGFloat compoents[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 locations[3]={0,0.3,1.0};
CGGradientRef gradient= CGGradientCreateWithColorComponents(colorSpace, compoents, locations, 3);
/*绘制径向渐变
context:图形上下文
gradient:渐变色
startCenter:起始点位置 这个起始点是比较坑的地方 这个点是相对于self的位置 frame:{{112.5, 258.5}, {150, 150}} 那么这个点就是(75,75)了
startRadius:起始半径(通常为0,否则在此半径范围内容无任何填充)
endCenter:终点位置(通常和起始点相同,否则会有偏移)
endRadius:终点半径(也就是渐变的扩散长度)
options:绘制方式,kCGGradientDrawsBeforeStartLocation 开始位置之前就进行绘制,但是到结束位置之后不再绘制,
kCGGradientDrawsAfterEndLocation开始位置之前不进行绘制,但到结束点之后继续填充
*/
CGContextDrawRadialGradient(context, gradient, CGPointMake(75, 75),0, CGPointMake(75, 75), 75, kCGGradientDrawsAfterEndLocation);
//释放颜色空间
CGColorSpaceRelease(colorSpace);
}
看一下效果图
用CAGradientLayer也可以实现渐变的效果,大家可以尝试一下!