實用小技巧(三十六) —— 基于CoreGraphic漸變色的簡單實現(xiàn)(一)

版本記錄

版本號 時間
V1.0 2020.06.28 星期日

前言

在app中,很多時候都需要熟悉一些小技巧讓您事半功倍,提高工作效率,這些小技巧都很小很細(xì)。感興趣的可以看看我寫的其他小技巧候味。
1. 實用小技巧(一):UIScrollView中上下左右滾動方向的判斷
2. 實用小技巧(二):屏幕橫豎屏的判斷和相關(guān)邏輯
3.實用小技巧(三):點擊手勢屏蔽子視圖的響應(yīng)
4.實用小技巧(四):動態(tài)的增刪標(biāo)簽視圖
5.實用小技巧(五):通過相冊或者相機更改圖標(biāo)
6.實用小技巧(六):打印ios里所有字體
7. 實用小技巧(七):UITableViewCell自適應(yīng)行高的計算
8. 實用小技巧(八):數(shù)字余額顯示的分隔
9.實用小技巧(九):類頭條模糊背景的實現(xiàn)
10.實用小技巧(十):晃動手機換后臺服務(wù)器網(wǎng)絡(luò)
11.實用小技巧(十一):scrollView及其子類顯示的一些異常處理
12.實用小技巧(十二):頭像圖片縮放以及保存到相冊簡單功能的實現(xiàn)
13.實用小技巧(十三):一種類酷我音樂盒動畫實現(xiàn)
14.實用小技巧(十四):生成跳往applestore指定app的方法
15.實用小技巧(十五):左側(cè)向右滑動返回上一級控制器
16.實用小技巧(十六):獲取設(shè)備信息
17.實用小技巧(十七):清除緩存目錄
18.實用小技巧(十八):取出gif圖的每一幀
19.實用小技巧(十九):獲取相機和麥克風(fēng)權(quán)限
20.實用小技巧(二十):游客模式的實現(xiàn)
21.實用小技巧(二十一):版本檢測的實現(xiàn)
22.實用小技巧(二十二):鍵盤遮擋問題
23. 實用小技巧(二十三):獲取閃光燈的控制
24. 實用小技巧(二十四):APP頁面開啟跳轉(zhuǎn)邏輯處理
25. 實用小技巧(二十五)—— 關(guān)于UILabel控件寬高的計算
26. 實用小技巧(二十六)—— APP中各種權(quán)限監(jiān)測和申請工具封裝
27. 實用小技巧(二十七)—— 控制器跳轉(zhuǎn)邏輯的封裝
28. 實用小技巧(二十八)—— 一種字符串的遍歷方式
29. 實用小技巧(二十九)—— 漢字的判斷以及計數(shù)
30. 實用小技巧(三十)—— 數(shù)字的判斷以及計數(shù)
31. 實用小技巧(三十一)—— 版本監(jiān)測工具的封裝
32. 實用小技巧(三十二)—— 項目中代碼行數(shù)統(tǒng)計
33. 實用小技巧(三十三)—— json和對象之間的轉(zhuǎn)化工具的封裝(一)
34. 實用小技巧(三十四)—— 設(shè)置一個UILabel控件不同行文字字體樣式以及行間距等個性化設(shè)置(一)
35. 實用小技巧(三十五)—— UITabBar上業(yè)務(wù)相關(guān)的紅點展示和移除邏輯實現(xiàn)(一)

問題描述

很多頁面都需要漸變色,目前有一種比較常見的設(shè)置漸變色的方式隔心,就是寫一個控件白群,比如UIButton或者UIView的一個子類,在子類里面實例化一個CAGradientLayer硬霍,然后在子類的根layeradd這個漸變的gradientLayer帜慢。

[self.layer insertSublayer:self.gradientLayer atIndex:0];

這個就不多說了,下面想說的是通過UIColor分類唯卖,實現(xiàn)自定義的顏色粱玲,滿足漸變色的這個需求。


問題解決

其實就是使用UIColor 這個API的一個方法

+ (UIColor *)colorWithPatternImage:(UIImage *)image;

這里就是根據(jù)給定的patternImage返回一個UIColor拜轨。這里patternImage就是根據(jù)CoreGraphics畫出來的抽减。

下面就是寫的一個Demo 示例

首先新建一個工程,在sb中拖進去一個UILabel設(shè)置好文字和約束橄碾,拉好IBOutlet卵沉,這樣的文字控件就準(zhǔn)備完畢了颠锉,用于展示。

下面就是分類了偎箫,分別是UIColorNSArray的分類木柬。

直接上代碼了哈

1. UIColor+Util.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIColor (Util)

/**
 *  根據(jù)漸變色返回梯度漸變色
 *
 *  @param colors數(shù)組
 *  @return 對應(yīng)顏色
 */
+ (UIColor*)jj_gradientColorWithColors:(NSArray*)colors
                                  size:(CGSize)size
                            startPoint:(CGPoint)startPoint
                              endPoint:(CGPoint)endPoint;

@end

NS_ASSUME_NONNULL_END
2. UIColor+Util.m
#import "UIColor+Util.h"
#import "NSArray+Blocks.h"

@implementation UIColor (Util)

+ (UIColor*)jj_gradientColorWithColors:(NSArray*)colors
      size:(CGSize)size
startPoint:(CGPoint)startPoint
  endPoint:(CGPoint)endPoint
{
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    
    NSArray* cgColors = [colors jj_map:^id(id color) {
        return (id)[color CGColor];
    }];
        
    CGGradientRef gradient = CGGradientCreateWithColors(colorspace, (CFArrayRef)cgColors, NULL);
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorspace);
    
    return [UIColor colorWithPatternImage:image];
}

@end
3. NSArray+Blocks.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSArray<ObjectType> (Blocks)

- (NSArray *)jj_map:(id (NS_NOESCAPE ^)(ObjectType obj))block;

@end

NS_ASSUME_NONNULL_END
4. NSArray+Blocks.m
#import "NSArray+Blocks.h"

@implementation NSArray (Blocks)

- (NSArray *)jj_map:(id (NS_NOESCAPE ^)(id obj))block
{
  NSParameterAssert(block != nil);
  
  NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count];
  
  [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    id value = block(obj) ?: [NSNull null];
    [result addObject:value];
  }];
  
  return result;
}


@end
5. ViewController.m
#import "ViewController.h"
#import "UIColor+Util.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *contentLabel;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    CGSize size = self.contentLabel.bounds.size;
    NSArray<UIColor*> *colors = @[[UIColor redColor], [UIColor greenColor]];
    CGPoint startPoint = CGPointMake(0, 0);
    CGPoint endPoint = CGPointMake(size.width, 0);
    self.contentLabel.textColor = [UIColor jj_gradientColorWithColors:colors size:size startPoint:startPoint endPoint:endPoint];
}

@end

下面就是看效果了哈

可以看見皆串,自定義UIColor生效了淹办。


拓展

1. 漸變實心

一樣先在sb中拉進去一個UIImageView,在工程中添加一個UIImage的一個分類恶复。

下面就是先看代碼

1. UIImage+Util.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIImage (Util)

+ (UIImage*)jj_gradientCircleImageWithColors:(NSArray*)colors
      size:(CGSize)size
startPoint:(CGPoint)startPoint
  endPoint:(CGPoint)endPoint;

@end

NS_ASSUME_NONNULL_END
2. UIImage+Util.m
#import "UIImage+Util.h"
#import "NSArray+Blocks.h"

@implementation UIImage (Util)

+ (UIImage*)jj_gradientCircleImageWithColors:(NSArray*)colors
      size:(CGSize)size
startPoint:(CGPoint)startPoint
  endPoint:(CGPoint)endPoint
{
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    
    NSArray* cgColors = [colors jj_map:^id(id color) {
        return (id)[color CGColor];
    }];
        
    CGGradientRef gradient = CGGradientCreateWithColors(colorspace, (CFArrayRef)cgColors, NULL);
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorspace);
    
    return image;
}

@end
3. ViewController.m
#import "ViewController.h"
#import "UIColor+Util.h"
#import "UIImage+Util.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *circleImageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //漸變實心底色
    NSArray<UIColor*> *colors = @[[UIColor redColor], [UIColor greenColor]];
    CGSize size = self.circleImageView.bounds.size;
    CGPoint startPoint = CGPointMake(0, 0);
    CGPoint endPoint = CGPointMake(size.width, size.height);
    UIImage *circleImage = [UIImage jj_gradientCircleImageWithColors:colors size:size startPoint:startPoint endPoint:endPoint];
    self.circleImageView.image = circleImage; 
}

@end

下面就是實際效果

2. 矩形邊框漸變

下面就在上面基礎(chǔ)上更改代碼實現(xiàn)邊框漸變色怜森。

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //漸變邊框
    NSArray<UIColor*> *colors = @[[UIColor redColor], [UIColor greenColor]];
    CGSize size = self.circleImageView.bounds.size;
    CGPoint startPoint = CGPointMake(0, 0);
    CGPoint endPoint = CGPointMake(size.width, size.height);
    UIColor *color = [UIColor jj_gradientColorWithColors:colors size:size startPoint:startPoint endPoint:endPoint];
    self.circleImageView.layer.borderColor = color.CGColor;
    self.circleImageView.layer.borderWidth = 1.0;
}

下面看一下實際效果

2. 圓環(huán)邊框漸變

下面我們就稍微改動下,看一下圓環(huán)漸變的效果

還是直接看代碼

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //圓環(huán)漸變邊框
    NSArray<UIColor*> *colors = @[[UIColor redColor], [UIColor greenColor]];
    CGSize size = self.circleImageView.bounds.size;
    CGPoint startPoint = CGPointMake(0, 0);
    CGPoint endPoint = CGPointMake(size.width, size.height);
    UIColor *color = [UIColor jj_gradientColorWithColors:colors size:size startPoint:startPoint endPoint:endPoint];
    self.circleImageView.layer.cornerRadius = size.width * 0.5;
    self.circleImageView.layer.masksToBounds = YES;
    self.circleImageView.layer.borderColor = color.CGColor;
    self.circleImageView.layer.borderWidth = 1.0;
}

@end

下面還是看下實際效果

后記

本篇主要講述了基于CoreGraphic漸變色的簡單實現(xiàn)谤牡,感興趣的給個贊或者關(guān)注~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末副硅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翅萤,更是在濱河造成了極大的恐慌恐疲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件套么,死亡現(xiàn)場離奇詭異培己,居然都是意外死亡,警方通過查閱死者的電腦和手機胚泌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門省咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玷室,你說我怎么就攤上這事零蓉。” “怎么了穷缤?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵敌蜂,是天一觀的道長。 經(jīng)常有香客問我津肛,道長章喉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任快耿,我火速辦了婚禮囊陡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掀亥。我一直安慰自己撞反,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布搪花。 她就那樣靜靜地躺著遏片,像睡著了一般嘹害。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吮便,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天笔呀,我揣著相機與錄音,去河邊找鬼髓需。 笑死许师,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的僚匆。 我是一名探鬼主播微渠,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咧擂!你這毒婦竟也來了逞盆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤松申,失蹤者是張志新(化名)和其女友劉穎云芦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贸桶,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡舅逸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刨啸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堡赔。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖设联,靈堂內(nèi)的尸體忽然破棺而出善已,到底是詐尸還是另有隱情,我是刑警寧澤离例,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布换团,位于F島的核電站,受9級特大地震影響宫蛆,放射性物質(zhì)發(fā)生泄漏艘包。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一耀盗、第九天 我趴在偏房一處隱蔽的房頂上張望想虎。 院中可真熱鬧,春花似錦叛拷、人聲如沸舌厨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裙椭。三九已至躏哩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揉燃,已是汗流浹背扫尺。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炊汤,地道東北人正驻。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像婿崭,于是被迫代替她去往敵國和親拨拓。 傳聞我的和親對象是個殘疾皇子肴颊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353