根據(jù)UIColor生成一個可以帶任意圓角的圖片
.h 文件
#import <UIKit/UIKit.h>
@interface UIImage (LGFColorImage)
#pragma mark - 生成一個平面顏色圓角可縮放圖像
/**
@param cornerRadius 圓角半徑
@param cornerColor 圓角被截取部分填充色
@param fillColor 背景填充色
*/
+ (UIImage *)lgf_ColorImageWithCornerRadius:(CGFloat)cornerRadius
cornerColor:(UIColor *)cornerColor
fillColor:(UIColor *)fillColor;
#pragma mark - 生成具有邊框的平面顏色圓角可縮放圖像
/**
@param cornerRadius 圓角半徑
@param cornerColor 圓角被截取部分填充色
@param fillColor 背景填充色
@param borderColor 邊框顏色
@param borderWidth 邊框?qū)挾? */
+ (UIImage *)lgf_ColorImageWithCornerRadius:(CGFloat)cornerRadius
cornerColor:(UIColor *)cornerColor
fillColor:(UIColor *)fillColor
borderColor:(UIColor *)borderColor
borderWidth:(CGFloat)borderWidth;
#pragma mark - 生成具有邊框的平面顏色圓角可縮放圖像
/**
@param cornerRadius 圓角半徑
@param cornerColor 圓角被截取部分填充色
@param fillColor 背景填充色
@param borderColor 邊框顏色
@param borderWidth 邊框?qū)挾? @param roundedCorners 設置圓角個數(shù) 和 位置 (UIRectCornerTopLeft | UIRectCornerBottomRight | UIRectCornerTopRight | UIRectCornerBottomLeft)
@param scale 每個點的縮放像素密度. 設置 0 為和當前屏幕一樣.
*/
+ (UIImage *)lgf_ColorImageWithCornerRadius:(CGFloat)cornerRadius
cornerColor:(UIColor *)cornerColor
fillColor:(UIColor *)fillColor
borderColor:(UIColor *)borderColor
borderWidth:(CGFloat)borderWidth
roundedCorners:(UIRectCorner)roundedCorners
scale:(CGFloat)scale;
@end
.m 文件
#import "UIImage+LGFColorImage.h"
@implementation UIImage (LGFColorImage)
#pragma mark - 生成一個平面顏色圓角可縮放圖像
/**
@param cornerRadius 圓角半徑
@param cornerColor 圓角被截取部分填充色
@param fillColor 背景填充色
*/
+ (UIImage *)lgf_ColorImageWithCornerRadius:(CGFloat)cornerRadius
cornerColor:(UIColor *)cornerColor
fillColor:(UIColor *)fillColor {
return [self lgf_ColorImageWithCornerRadius:cornerRadius
cornerColor:cornerColor
fillColor:fillColor
borderColor:nil
borderWidth:1.0
roundedCorners:UIRectCornerAllCorners
scale:0.0];
}
#pragma mark - 生成具有邊框的平面顏色圓角可縮放圖像
/**
@param cornerRadius 圓角半徑
@param cornerColor 圓角被截取部分填充色
@param fillColor 背景填充色
@param borderColor 邊框顏色
@param borderWidth 邊框?qū)挾? */
+ (UIImage *)lgf_ColorImageWithCornerRadius:(CGFloat)cornerRadius
cornerColor:(UIColor *)cornerColor
fillColor:(UIColor *)fillColor
borderColor:(UIColor *)borderColor
borderWidth:(CGFloat)borderWidth {
return [self lgf_ColorImageWithCornerRadius:cornerRadius
cornerColor:cornerColor
fillColor:fillColor
borderColor:borderColor
borderWidth:borderWidth
roundedCorners:UIRectCornerAllCorners
scale:0.0];
}
#pragma mark - 生成具有邊框的平面顏色圓角可縮放圖像
/**
@param cornerRadius 圓角半徑
@param cornerColor 圓角被截取部分填充色
@param fillColor 背景填充色
@param borderColor 邊框顏色
@param borderWidth 邊框?qū)挾? @param roundedCorners 設置圓角個數(shù) 和 位置 (UIRectCornerTopLeft | UIRectCornerBottomRight | UIRectCornerTopRight | UIRectCornerBottomLeft)
@param scale 每個點的縮放像素密度. 設置 0 為和當前屏幕一樣.
*/
+ (UIImage *)lgf_ColorImageWithCornerRadius:(CGFloat)cornerRadius
cornerColor:(UIColor *)cornerColor
fillColor:(UIColor *)fillColor
borderColor:(UIColor *)borderColor
borderWidth:(CGFloat)borderWidth
roundedCorners:(UIRectCorner)roundedCorners
scale:(CGFloat)scale {
static NSCache *__pathCache = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
__pathCache = [[NSCache alloc] init];
__pathCache.countLimit = 20;
});
if ([cornerColor isEqual:[UIColor clearColor]]) {
cornerColor = nil;
}
CGFloat dimension = (cornerRadius * 2) + 1;
CGRect bounds = CGRectMake(0, 0, dimension, dimension);
typedef struct {
UIRectCorner corners;
CGFloat radius;
} PathKey;
PathKey key = { roundedCorners, cornerRadius };
NSValue *pathKeyObject = [[NSValue alloc] initWithBytes:&key objCType:@encode(PathKey)];
CGSize cornerRadii = CGSizeMake(cornerRadius, cornerRadius);
UIBezierPath *path = [__pathCache objectForKey:pathKeyObject];
if (path == nil) {
path = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:roundedCorners cornerRadii:cornerRadii];
[__pathCache setObject:path forKey:pathKeyObject];
}
UIGraphicsBeginImageContextWithOptions(bounds.size, cornerColor != nil, scale);
BOOL contextIsClean = YES;
if (cornerColor) {
contextIsClean = NO;
[cornerColor setFill];
UIRectFillUsingBlendMode(bounds, kCGBlendModeCopy);
}
BOOL canUseCopy = contextIsClean || (CGColorGetAlpha(fillColor.CGColor) == 1);
[fillColor setFill];
[path fillWithBlendMode:(canUseCopy ? kCGBlendModeCopy : kCGBlendModeNormal) alpha:1];
if (borderColor) {
[borderColor setStroke];
CGRect strokeRect = CGRectInset(bounds, borderWidth / 2.0, borderWidth / 2.0);
UIBezierPath *strokePath = [UIBezierPath bezierPathWithRoundedRect:strokeRect
byRoundingCorners:roundedCorners
cornerRadii:cornerRadii];
[strokePath setLineWidth:borderWidth];
BOOL canUseCopy = (CGColorGetAlpha(borderColor.CGColor) == 1);
[strokePath strokeWithBlendMode:(canUseCopy ? kCGBlendModeCopy : kCGBlendModeNormal) alpha:1];
}
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIEdgeInsets capInsets = UIEdgeInsetsMake(cornerRadius, cornerRadius, cornerRadius, cornerRadius);
result = [result resizableImageWithCapInsets:capInsets resizingMode:UIImageResizingModeStretch];
return result;
}
@end