iOS 解决使用 CAGradientLayer 设置渐变色的坑

3,548 阅读1分钟

一般都知道使用 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)];
}

`