类似gradientLayer绘制成渐变图片

今天有个需求,需要给了渐变颜色,然后制作出渐变图片。
应用场景,比如给button设置背景图,然后按下效果是button normal状态下透明度0.7.所以只能用制作图片来做了。
传入常用gradientLayer的colors,button尺寸,圆角参数,最后一个是你传入渐变的不同位置。
eg:CGFloat locations[] = {0.3, 0.6, 1.0};
最后附上封装好的方法。

+ (UIImage *)makeGradientImageWithColors:(NSArray *)colors withSize:(CGSize)size cornerRadius:(CGFloat)radius locations:(CGFloat *)locations {
    
    UIGraphicsBeginImageContext(size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGMutablePathRef path = CGPathCreateMutable();
    //绘制Path
    CGPathMoveToPoint(path, NULL, 0.f, 0.f);
    CGPathAddLineToPoint(path, NULL, size.width - radius,0);
    CGPathAddArc(path, &CGAffineTransformIdentity, size.width - radius, radius, radius, -0.5 *M_PI,0.0,0);
    CGPathAddLineToPoint(path, NULL, size.width, size.height - radius);
    CGPathAddArc(path, &CGAffineTransformIdentity, size.width - radius, size.height - radius, radius,0.0,0.5 *M_PI,0);
    CGPathAddLineToPoint(path, NULL, radius, size.height);
    CGPathAddArc(path, &CGAffineTransformIdentity, radius, size.height - radius, radius,0.5 *M_PI,M_PI,0);
    CGPathAddLineToPoint(path, NULL, 0, radius);
    CGPathAddArc(path, &CGAffineTransformIdentity, radius, radius, radius,M_PI,1.5 *M_PI,0);
    CGPathCloseSubpath(path);
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations);
    CGPoint startPoint = CGPointMake(0, 0);
    CGPoint endPoint = CGPointMake(size.width, 0);
    CGContextSaveGState(context);
    CGContextAddPath(context, path);
    CGContextClip(context);
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
    CGContextRestoreGState(context);
    
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorSpace);
    CGPathRelease(path);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

效果:
3BDCB64D-B090-47D0-A09B-ADB7C91345DF.png

你可能感兴趣的:(类似gradientLayer绘制成渐变图片)