-
实现效果图如下,具体颜色按实际需要更改即可。
实现方案思路 新建一个UIView的子类(CustomView),然后重写CustomView的drawRect:方法,将这个渐变背景色画在view上。在外边使用该view,只需要指定聚光灯的位置,和聚光灯的大小。
以下为CustomView里面具体方案的代码实现
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];
}
return self;
}
- (void)drawRect:(CGRect)rect {
[self draw];
}
- (void)draw {
// 创建色彩空间对象
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
// 创建起点和终点颜色分量的数组
CGFloat colors[] =
{
1, 0, 0, 1.00,//start color(r,g,b,alpha)
255, 255, 255, 1.00,//end color
};
//形成梯形,渐变的效果
CGGradientRef gradient = CGGradientCreateWithColorComponents
(rgb, colors, NULL, 2);
// NSLog(@"%lu",sizeof(colors)/(sizeof(colors[0])*4));
// 起点颜色起始圆心
CGPoint start = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
// 终点颜色起始圆心
CGPoint end = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
// 起点颜色圆形半径
CGFloat startRadius = 0.0f;
// 终点颜色圆形半径
CGFloat endRadius = 100;
// 获取上下文
CGContextRef graCtx = UIGraphicsGetCurrentContext();
// 创建一个径向渐变
CGContextDrawRadialGradient(graCtx, gradient, start, startRadius, end, endRadius, 0);
//releas
CGGradientRelease(gradient);
gradient=NULL;
CGColorSpaceRelease(rgb);
}
- 方法中主要函数介绍
这里主要用到了CGContextDrawRadialGradient和CGGradientCreateWithColorComponents函数
void CGContextDrawRadialGradient(
CGContextRef context, //绘制图形的上下文
CGGradientRef gradient, //一个渐变梯度CGGradientRefCGPoint startCenter, // 颜色渐变起点的中心点CGFloat startRadius, // 起点的半径
CGPoint endCenter, // 颜色渐变终点的中心点
CGFloat endRadius, //终点的半径
CGGradientDrawingOptions options //当你的起点或者终点不在图形上下文的边缘内时,指定该如何处理。你可以使用你的开始或结束颜色来填充渐变以外的空间。此参数为以下值之一:KCGGradientDrawsAfterEndLocation扩展整个渐变到渐变的终点之后的所有点 KCGGradientDrawsBeforeStartLocation扩展整个渐变到渐变的起点之前的所有点。0不扩展该渐变。);
对于渐变梯度CGGradientRef的创建我们可以使用CGGradientCreateWithColorComponents函数
CGGradientCreateWithColorComponents (
CGColorSpaceRef space,//色彩空间
const CGFloat *components,//颜色分量的数组
const CGFloat *locations,//位置数组
size_t count//位置的数量,因为这里我们只用到了两种颜色,所以此参数在demo中为2
);
1)色彩空间:(Color Space)这是一个色彩范围的容器,类型必须是CGColorSpaceRef.对于这个参数,我们可以传入CGColorSpaceCreateDeviceRGB函数的返回值,它将给我们一个RGB色彩空间。
2)颜色分量的数组:这个数组必须包含CGFloat类型的红、绿、蓝和alpha值。数组中元素的数量和接下来两个参数密切。从本质来讲,你必须让这个数组包含足够的值,用来指定第四个参数中位置的数量。所以如果你需要两个位置(起点和终点),那么你必须为数组提供两种颜色。
3) 位置数组:颜色数组中各个颜色的位置。此参数控制该渐变从一种颜色过渡到另一种颜色的速度有多快。
4)位置的数量:这个参数指明了我们需要多少颜色和位置。