平時在寫一些demo的過程中撒穷,想給按鈕加一些背景圖片捕儒,又苦于沒有美工去做切圖隐圾,而只設(shè)置按鈕背景顏色的話又沒有高亮效果,想著不如自己用代碼生成一個UIImage來做碗脊,于是封裝了一些UIImage的擴展類方法啼肩,直接調(diào)用即可,很方便(效果見最下面demo)衙伶。
- 直角矩形
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size
{
CGRect rect = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- 圓角矩形
+ (UIImage *)drawRoundRectImageWithColor:(UIColor *)color size:(CGSize)size
{
CGRect rect = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
//去鋸齒處理
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
CGContextSetFillColorWithColor(context, [color CGColor]);
//切圓角
float radius = MIN(size.width, size.height);
[[UIBezierPath bezierPathWithRoundedRect:rect
cornerRadius:radius/5] addClip];
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- 圓形
+ (UIImage *)drawRoundImageWithColor:(UIColor *)color size:(CGSize)size isEmpty:(BOOL)empty
{
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
//去鋸齒處理
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
CGContextAddArc(context, size.width/2, size.height/2, size.width/2 - 2, 0, 2*M_PI, YES);
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
CGContextSetLineWidth(context, 2);//線條寬度
if (empty)
{
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);//填充顏色
}
else
{
CGContextSetFillColorWithColor(context, color.CGColor);//填充顏色
}
CGContextDrawPath(context, kCGPathFillStroke);//繪制路徑加填充
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- 三角形
+ (UIImage *)drawRadarBottomImageWithColor:(UIColor *)color size:(CGSize)size isEmpty:(BOOL)empty
{
CGRect rect = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
//去鋸齒處理
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
//畫圓點
CGContextAddArc(context, size.width/2, size.width/2, size.width/20, 0, 2*M_PI, YES);
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
CGContextSetLineWidth(context, 2);//線條寬度
if (empty)
{
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);//填充顏色
}
else
{
CGContextSetFillColorWithColor(context, color.CGColor);//填充顏色
}
CGContextDrawPath(context, kCGPathFillStroke);
//只要三個點就行跟畫一條線方式一樣祈坠,把三點連接起來
CGPoint sPoints[3];//坐標點
sPoints[0] = CGPointMake(size.width/2, size.height/2 + 6);//坐標1
sPoints[1] = CGPointMake(size.width/2 - 10, size.height-2);//坐標2
sPoints[2] = CGPointMake(size.width/2 + 10, size.height-2);//坐標3
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
CGContextAddLines(context, sPoints, 3);//添加線
CGContextSetLineWidth(context, 2);//線條寬度
CGContextClosePath(context);//封起來
if (empty)
{
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);//填充顏色
}
else
{
CGContextSetFillColorWithColor(context, color.CGColor);//填充顏色
}
CGContextDrawPath(context, kCGPathFillStroke); //根據(jù)坐標繪制路徑
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- 笑臉
+ (UIImage *)drawSmileFaceImageWithColor:(UIColor *)color size:(CGSize)size radius:(float)radius
{
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
//眼睛
CGContextAddArc(context, size.width/3, size.width/3, size.width/15, 0, 2*M_PI, YES);
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
CGContextSetLineWidth(context, 2);//線條寬度
CGContextSetFillColorWithColor(context, color.CGColor);//填充顏色
CGContextDrawPath(context, kCGPathFillStroke);//繪制路徑加填充
CGContextAddArc(context, size.width*2/3, size.width/3, size.width/15, 0, 2*M_PI, YES);
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
CGContextSetLineWidth(context, 2);//線條寬度
CGContextSetFillColorWithColor(context, color.CGColor);//填充顏色
CGContextDrawPath(context, kCGPathFillStroke);//繪制路徑加填充
//嘴
drawArc(color, CGPointMake(size.width/2, size.height/2), radius, 180/8, 180*7/8, NO);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
/*
畫圓弧
CGContextAddArc(context, 圓心x, 圓心y, 半徑, 開始弧度, 結(jié)束弧度, 1逆時針0順時針);
角度坐標象限示意圖:
PI*3/2
|
|
|
PI ________|_______ 0
|
|
|
PI/2
*/
void drawArc(UIColor *color, CGPoint center, CGFloat radius, CGFloat startAngle, CGFloat endAngle, bool isClockwise)
{
//1.獲得圖形上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//2.繪制圖形
CGContextAddArc(context, center.x, center.y, radius, arc(startAngle), arc(endAngle), isClockwise);
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
CGContextSetLineWidth(context, 2);//線條寬度
CGContextSetFillColorWithColor(context, [UIColor orangeColor].CGColor);//填充顏色
//3.顯示
// CGContextDrawPath(context, kCGPathFillStroke);//繪制路徑加填充
//kCGPathFill填充非零繞數(shù)規(guī)則,kCGPathEOFill表示用奇偶規(guī)則,kCGPathStroke路徑,kCGPathFillStroke路徑填充,kCGPathEOFillStroke表示描線,不是填充
//3.顯示
CGContextStrokePath(context);//繪制路徑
}
//角度轉(zhuǎn)弧度
CGFloat arc(float angle)
{
return angle*M_PI/180;
}
其中笑臉的眼睛為兩個實心圓矢劲,嘴使用CGContextAddArc
函數(shù)畫一個圓弧赦拘,這一拼湊出一個笑臉(其實主要還是想使用一下畫圓弧的這個方法_)
- 橢圓
//橢圓
+ (UIImage *)drawEllipseImageWithColor:(UIColor *)color size:(CGSize)size isEmpty:(BOOL)empty
{
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2);//線條寬度
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
//去鋸齒處理
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
//繪制橢圓
CGContextAddEllipseInRect(context, CGRectMake(2, 2, size.width-4, size.height-4));
if (empty)
{
CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);//填充顏色
}
else
{
CGContextSetFillColorWithColor(context, color.CGColor);//填充顏色
}
CGContextDrawPath(context, kCGPathFillStroke);//繪制路徑加填充
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- 貝塞爾曲線
//貝塞爾曲線
+ (UIImage *)drawBezierLineImageWithColor:(UIColor *)color size:(CGSize)size isEmpty:(BOOL)empty
{
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2);//線條寬度
CGContextSetStrokeColorWithColor(context, color.CGColor);//線條顏色
//繪制貝塞爾
CGPoint fromPoint = CGPointMake(0, size.height/2); //起點
CGPoint toPoint = CGPointMake(size.width, size.height/2); //終點
CGPoint controlPoint1 = CGPointMake(size.width/3, 0); //控制點1
CGPoint controlPoint2 = CGPointMake(size.width*2/3, size.height); //控制點2
CGContextMoveToPoint(context, fromPoint.x, fromPoint.y);
CGContextAddCurveToPoint(context, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, toPoint.x, toPoint.y);
if (empty)
{
CGContextStrokePath(context);//填充顏色
}
else
{
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);//填充顏色
CGContextDrawPath(context, kCGPathFillStroke);//繪制路徑加填充
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
不定期更新補充...
Demo下載鏈接:CategoryDemo
已支持CocoaPods方式集成:
pod search UIImageKit
-> UIImageKit (1.0.0)
UIImageKit is a library of UIImage class.
pod 'UIImageKit', '~> 1.0.0'
- Homepage: https://github.com/Kangqj/UIImageKit
- Source: https://github.com/Kangqj/UIImageKit.git
- Versions: 1.0.0 [master repo]
(END)