一般都知道使用 CAGradientLayer 实现 View 渐变色,但是在实际过程中,会可能遇到一些坑,这里主要是解决两种坑,也为大家解决其他类似问题提供一些思路。
1、解决 UIButton 、UILabel 等需要显示的 文字或者图片被渐变色覆盖
2、解决根据接口的某个状态,动态改变 View 的渐变色失效
为了让大家使用代码比较便捷,创建一个分类,这里主要分两种情况进行处理,一种是在第一次设置渐变色的时候,插入到 layer 的最底层,这样不会影响初始化 View 添加的 内容,第二种是在已经设置过渐变色后,替换原有的渐变色,达到 View 中既不会有多重渐变色,又解决了改变渐变色失效和渐变色覆盖 View 中内容的问题,一箭双雕。
- (void)kk_addGradientLayerWithStartColor:(UIColor *)startColor endColor:(UIColor *)endColor startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint {
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = @[(__bridge id)startColor.CGColor, (__bridge id)endColor.CGColor];
gradientLayer.locations = @[@0.0, @1.0];
gradientLayer.startPoint = startPoint;
gradientLayer.endPoint = endPoint;
gradientLayer.frame = self.bounds;
if (self.layer.sublayers.count == 0) {
[self.layer insertSublayer:gradientLayer atIndex:0];
} else {
for (int i = 0; i < self.layer.sublayers.count; i++) {
if ([self.layer.sublayers[i] isKindOfClass:[CAGradientLayer class]]) {
NSMutableArray *arrs = [NSMutableArray arrayWithArray:self.layer.sublayers];
[arrs replaceObjectAtIndex:i withObject:gradientLayer];
self.layer.sublayers = [NSArray arrayWithArray:arrs];
break;
} else if (i == (self.layer.sublayers.count - 1)) {
[self.layer insertSublayer:gradientLayer atIndex:0];
break;
}
}
}
}
- (void)kk_addGradientLayerWithStartColor:(UIColor *)startColor endColor:(UIColor *)endColor {
return [self kk_addGradientLayerWithStartColor:startColor
endColor:endColor
startPoint:CGPointMake(0.0, 0.0)
endPoint:CGPointMake(1.0, 0.0)];
}
`