UIImage工具類

平時在寫一些demo的過程中,想給按鈕加一些背景圖片,又苦于沒有美工去做切圖,而只設置按鈕背景顏色的話又沒有高亮效果,想著不如自己用代碼生成一個UIImage來做,于是封裝了一些UIImage的擴展類方法,直接調用即可,很方便(效果見最下面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); //根據坐標繪制路徑
    
    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, 半徑, 開始弧度, 結束弧度, 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填充非零繞數規則,kCGPathEOFill表示用奇偶規則,kCGPathStroke路徑,kCGPathFillStroke路徑填充,kCGPathEOFillStroke表示描線,不是填充
    
    //3.顯示
    CGContextStrokePath(context);//繪制路徑
}
//角度轉弧度
CGFloat arc(float angle)
{
    return angle*M_PI/180;
}

其中笑臉的眼睛為兩個實心圓,嘴使用CGContextAddArc函數畫一個圓弧,這一拼湊出一個笑臉(其實主要還是想使用一下畫圓弧的這個方法_

  • 橢圓
//橢圓
+ (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)

@Kangqj

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • Quartz2D以及drawRect的重繪機制字數1487 閱讀21 評論1 喜歡1一、什么是Quartz2D Q...
    PurpleWind閱讀 804評論 0 3
  • 可惜,又慢了一步。耳朵一晃,一時失了神,綠燈變成了紅燈。只好再等等。雙腿自覺地收回到白色的斑馬線前。遠處放肆的音樂...
    元子豐豐閱讀 149評論 0 0
  • 運動方面:堅持的不是很好,最近睡眠較晚,現在組里要求晚上也打卡,可以互相監督早睡,真好!已找到小跑團,非常開心! ...
    A心怡閱讀 215評論 0 0