iOS CAGradientLayer 漸變圖層

CAGradientLayer 漸變圖層

CAGradientLayer 是 CALayer 的子類辐马,用來制作漸變效果的圖層。

屬性介紹

colors //漸變顏色的數(shù)組(CGColorRef對象)
locations //漸變顏色位置局义,[0-1]范圍喜爷,遞增,數(shù)量和colors數(shù)量相等萄唇,否則無效
startPoint //漸變的起點(diǎn),[0,0]-[1,1]檩帐。[0,0]是左下角,[1,1]是右上角湃密。默認(rèn)值分別為[.5,0]和[.5,1]
endPoint //漸變的終點(diǎn),[0,0]-[1,1]四敞。

示例

  • 矩形漸變圖層


    這里寫圖片描述
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = CGRectMake(0, 64, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-64); //設(shè)置顯示的frame
gradientLayer.colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor]; //設(shè)置漸變顏色
// gradientLayer.locations = @[@0.0, @0.2, @0.5]; //顏色的起點(diǎn)位置,遞增忿危,并且數(shù)量跟顏色數(shù)量相等
gradientLayer.startPoint = CGPointMake(0, 0); // 
gradientLayer.endPoint = CGPointMake(1, 0); // 
[self.view.layer addSublayer:gradientLayer]; //將圖層添加到視圖的圖層上
  • 不規(guī)則形狀

由于 CAGradientLayer 不支持路徑填充达箍,所以只能繪制矩形的漸變。我們可以通過遮罩層 來顯示不規(guī)則漸變圖層缎玫,使用 CAShapeLayer 賦值給 CAGradientLayer 的 mask 屬性解滓,及可實(shí)現(xiàn)不規(guī)則圖形的漸變效果赃磨。mask 也可以是圖像等其他內(nèi)容,重疊的部分會被顯示洼裤,否則被隱藏煞躬。

這里寫圖片描述
// 獲取隨機(jī)數(shù)
#define getRandomNumberFromAtoB(A,B) (int)(A+(arc4random()%(B-A+1)))
// 貝塞爾曲線逸邦,生成隨機(jī)路徑
UIBezierPath *path = [UIBezierPath bezierPath]; 
NSInteger num = 50; 
CGFloat itemWidth = [UIScreen mainScreen].bounds.size.width/num;
for (int i=0; i<=num; i++) {
    if (i) {
        [path addLineToPoint:CGPointMake(i*itemWidth, getRandomNumberFromAtoB(100, 200))];  
    }
    else{
        [path moveToPoint:CGPointMake(i*itemWidth, getRandomNumberFromAtoB(100, 200))];   
    }
}
[path addLineToPoint:CGPointMake([UIScreen mainScreen].bounds.size.width, 300)];
[path addLineToPoint:CGPointMake(0, 300)];
[path closePath];   
// 創(chuàng)建 ShapeLayer
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.path = path.CGPath;
// 設(shè)置漸變層的 mask 遮罩層
gradientLayer.mask = maskLayer;

Core Graphics 實(shí)現(xiàn)漸變色

CAGradientLayer 是對 Core Graphics 底層的一個面向?qū)ο蟮姆庋b實(shí)現(xiàn),我們直接使用 Core Graphics 來實(shí)現(xiàn)漸變色雷客。Core Graphics 庫中有兩個方法用于繪制漸變顏色:CGContextDrawLinearGradient桥狡、CGContextDrawRadialGradient皱卓,前者可生成線性漸變,后者可生成徑向漸變娜汁。Core Graphics 可以通過 CGMutablePathRef來繪制出各種形狀里的漸變效果兄朋。

示例

  • 線性漸變
    這里寫圖片描述
  1. 首先創(chuàng)建一個path(形狀)
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 0, 100);
CGPathAddLineToPoint(path, NULL, [UIScreen mainScreen].bounds.size.width, 150);
CGPathAddLineToPoint(path, NULL, [UIScreen mainScreen].bounds.size.width, 400);
CGPathAddLineToPoint(path, NULL, 0, 350);
CGPathCloseSubpath(path);
  1. 給 path 設(shè)置漸變效果
NSArray *colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor]; // 漸變色數(shù)組
//為了將上下文本中的內(nèi)容生成圖像
UIGraphicsBeginImageContext(self.view.bounds.size);
//創(chuàng)建CGContextRef
CGContextRef context = UIGraphicsGetCurrentContext();   // 上下文
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//CGFloat locations[] = { 0.0, 0.3, 1.0 }; // 顏色位置設(shè)置,要跟顏色數(shù)量相等,否則無效
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, NULL);    // 漸變顏色效果設(shè)置       
//獲取到起止點(diǎn)
CGRect pathRect = CGPathGetBoundingBox(path);
CGPoint startPoint = CGPointMake(CGRectGetMinX(pathRect), CGRectGetMidY(pathRect));
CGPoint endPoint = CGPointMake(CGRectGetMaxX(pathRect), CGRectGetMidY(pathRect));
        
CGContextSaveGState(context);
CGContextAddPath(context, path); // 上下文添加路徑
CGContextClip(context);
// 繪制線性漸變
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation);
CGContextRestoreGState(context);     
// 需要手動釋放
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
CGPathRelease(path);
  1. 從當(dāng)前上下文獲取圖像并顯示
// 從Context中獲取圖像傅事,并顯示在界面上
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageView alloc] initWithImage:img];
[self.view addSubview:imgView];
  • 徑向漸變


    這里寫圖片描述
NSArray *colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor]; //漸變色數(shù)組
UIGraphicsBeginImageContext(self.view.bounds.size);
//創(chuàng)建CGContextRef
CGContextRef context = UIGraphicsGetCurrentContext(); //上下文文本
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, NULL);    // 漸變顏色效果設(shè)置       

//獲取圓心和半徑
CGRect pathRect = CGPathGetBoundingBox(path);
CGPoint center = CGPointMake(CGRectGetMidX(pathRect), CGRectGetMidY(pathRect));
CGFloat radius = MAX(pathRect.size.width / 2.0, pathRect.size.height / 2.0) * sqrt(2);
        
CGContextSaveGState(context);
CGContextAddPath(context, path); //添加路徑
CGContextClip(context);
//繪制徑向漸變
CGContextDrawRadialGradient(context, gradient, center, 0, center, radius, kCGGradientDrawsBeforeStartLocation);
CGContextRestoreGState(context);     
//需要手動釋放
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
CGPathRelease(path);

Demo地址

總結(jié)

使用 Core Graphics 實(shí)現(xiàn)漸變效果相對麻煩蹭越,幸好官方幫你進(jìn)行了封裝產(chǎn)生了 CAGradientLayer 漸變圖層對象教届。有了 CAGradientLayer 對象實(shí)現(xiàn)漸變效果變得簡單無比。

擴(kuò)展閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末买置,一起剝皮案震驚了整個濱河市萤衰,隨后出現(xiàn)的幾起案子猜旬,更是在濱河造成了極大的恐慌,老刑警劉巖洒擦,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熟嫩,死亡現(xiàn)場離奇詭異秦踪,居然都是意外死亡掸茅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門景馁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逗鸣,“玉大人绰精,你說我怎么就攤上這事透葛”渴梗” “怎么了僚害?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長最爬。 經(jīng)常有香客問我门岔,道長,這世上最難降的妖魔是什么寒随? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮互艾,結(jié)果婚禮上讯泣,老公的妹妹穿的比我還像新娘纫普。我一直安慰自己,他們只是感情好昨稼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布拳锚。 她就那樣靜靜地躺著,像睡著了一般霍掺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牙丽,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天兔魂,我揣著相機(jī)與錄音,去河邊找鬼入热。 笑死晓铆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绰播。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蠢箩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谬泌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掌实,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贱鼻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邻悬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了父丰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛾扇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屁桑,到底是詐尸還是另有隱情医寿,我是刑警寧澤蘑斧,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布须眷,位于F島的核電站竖瘾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捕传。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一庸论、第九天 我趴在偏房一處隱蔽的房頂上張望职辅。 院中可真熱鬧聂示,春花似錦域携、人聲如沸鱼喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋边。三九已至编曼,卻和暖如春豆巨,著一層夾襖步出監(jiān)牢的瞬間灵巧,已是汗流浹背搀矫。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工刻肄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓤球,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓卦羡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绿饵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容