我们经常会在UIView添加渐变的背景色。虽然找一张渐变颜色的背景图很方便,但是图片是要占用资源的,同时文件也会变大。所以,我们完全可以使用代码来实现效果。
下面是使用代码来写渐变色的方法。
1.使用CAGradientLayer实现渐变
CAGradientLayer是CALayer的一个特殊子类,用于生成颜色渐变的图层,使用较为方便,不过这里的颜色是添加到子图层的,再次添加渐变,会在图层上面添加,非替换。
下面介绍下它的相关属性:
1.colors 渐变的颜色
2.locations 渐变颜色的分割点
3.startPoint&endPoint 颜色渐变的方向,范围在(0,0)与(1.0,1.0)之间,如(0,0)(1.0,0)代表水平方向渐变,(0,0)(0,1.0)代表竖直方向渐变
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id)[UIColor yellowColor].CGColor, (__bridge id)[UIColor blueColor].CGColor];//这里颜色渐变
gradientLayer.locations = @[@0.3, @0.5, @1.0];//颜色位置
gradientLayer.startPoint = CGPointMake(0, 0);
gradientLayer.endPoint = CGPointMake(1.0, 0);
gradientLayer.frame = CGRectMake(0, 100, 300, 100);渐变区域的大小,一般同view
[self.view.layer addSublayer:gradientLayer];
2.绘制UIimage渐变图实现渐变,这种方法的好处在于可以直接更换背景,而不是在子图层再添加一个。
const CGFloat location[] ={0,1};
const CGFloat components[] ={
0.0,0.0,0.0,0.6,
0.0,0.0,0.0,0.0
};
UIImage *backgroundImage = [self getGradientImageWithSize:self.nBarView.frame.size locations:location components:components count:2];
_view.backgroundColor = [UIColor colorWithPatternImage:backgroundImage];
//渐变
- (UIImage *)getGradientImageWithSize:(CGSize)size
locations:(const CGFloat[])locations
components:(const CGFloat[])components
count:(NSInteger)count
{
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
//创建色彩空间
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
/*指定渐变色
space:颜色空间
components:颜色数组,注意由于指定了RGB颜色空间,那么四个数组元素表示一个颜色(red、green、blue、alpha),
如果有三个颜色则这个数组有4*3个元素
locations:颜色所在位置(范围0~1),这个数组的个数不小于components中存放颜色的个数
count:渐变个数,等于locations的个数
*/
CGGradientRef colorGradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, count);
//释放颜色空间
CGColorSpaceRelease(colorSpace);
//这里调节渐变方向,此时的渐变是上到下
CGPoint startPoint = (CGPoint){size.width,0};
CGPoint endPoint = (CGPoint){size.width,size.height};
/*绘制线性渐变
context:图形上下文
gradient:渐变色
startPoint:起始位置
endPoint:终止位置
options:绘制方式,kCGGradientDrawsBeforeStartLocation 开始位置之前就进行绘制,到结束位置之后不再绘制,
kCGGradientDrawsAfterEndLocation开始位置之前不进行绘制,到结束点之后继续填充
*/
CGContextDrawLinearGradient(context, colorGradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation);
CGGradientRelease(colorGradient);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
如果想对第一个种方法更深一层研究的话,推荐下面一篇博客
iOS实现UIView渐变的几种方法以及实现渐变透明功能
网友评论