實(shí)現(xiàn)方式
iOS實(shí)現(xiàn)控件背景顏色漸變實(shí)現(xiàn)方式校摩,我所知道的目前有三種。第一種:用圖片代替阶淘,簡(jiǎn)單直接在控件上面放一張漸變的圖片衙吩,即可實(shí)現(xiàn)。缺點(diǎn)是不能夠動(dòng)態(tài)變化溪窒,比如淘寶所用的提示語坤塞,背景色就是漸變的,顯然用圖片并不可取澈蚌。當(dāng)然安卓開發(fā)可以用點(diǎn)九圖摹芙。第二種:使用Quartz2D實(shí)現(xiàn)漸變。第三種:使用CAGradientLayer實(shí)現(xiàn)惜浅。也就是今天我所介紹的瘫辩。當(dāng)然是線性漸變。
具體步驟
屬性介紹
在實(shí)現(xiàn)漸變效果前坛悉,先來熟悉CAGradientLayer幾個(gè)屬性伐厌。startPoint和endPoint是漸變色起始坐標(biāo)與結(jié)束坐標(biāo)。這一點(diǎn)很重要裸影。還需要知道漸變色坐標(biāo)左上角為(0, 0),右下角為(1,1)挣轨。也就是說要想實(shí)現(xiàn)對(duì)角漸變可設(shè)置起始坐標(biāo)和結(jié)束坐標(biāo)分別為(0,0),(1,1)或者(0,1),(1,0)。如果要左右線性則設(shè)置(0,0),(1,0)轩猩。colors為設(shè)置幾種顏色得漸變卷扮,是一個(gè)數(shù)組格式。locations是一個(gè)位置集合均践,范圍是0到1晤锹。與colors中的顏色是一一對(duì)應(yīng)的,如果是左右漸變locations里面只有一個(gè)0.5元素彤委。則漸變色是從x=0.5軸向右漸變鞭铆,所以locations里面存儲(chǔ)的不是顏色區(qū)域,是漸變色開始的位置信息焦影。同理如果是對(duì)角線漸變則是x=y或者x= 1-y直線函數(shù)的位置開始漸變(只是兩種顏色漸變)车遂。關(guān)于漸變色基本上就是這幾個(gè)屬性封断。屬性含義弄清楚了,下面就好做了舶担。
具體實(shí)現(xiàn)
在控制器里添加如下代碼
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(20, 20, 200, 200)];
view.backgroundColor = [UIColor whiteColor];
CAGradientLayer *cagLayer = [CAGradientLayer layer];
cagLayer.frame = view.frame;
cagLayer.startPoint = CGPointMake(0, 0);
cagLayer.endPoint = CGPointMake(1, 0);
cagLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor];
[view.layer addSublayer:cagLayer];
[self.view addSubview:view];
沒有添加locations的情況效果如下可以看到是左右漸變
添加 cagLayer.locations =@[@0.5];效果如下
可以看紅色到明顯是從x=0.5軸向右漸變坡疼。一般都是對(duì)稱漸變,所以locations可以不設(shè)置衣陶。
擴(kuò)展部分
上面舉的例子都是背景色漸變柄瑰,下面舉的例子則是文字顏色漸變。
實(shí)現(xiàn)原理
UILabel *label = [[UILabel alloc] init];
label.text = @"你牛逼呀祖搓,你牛逼呀";
[label sizeToFit];
label.center = CGPointMake(200, 100);
[self.view addSubview:label];
// 創(chuàng)建漸變層
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = label.frame;
// 設(shè)置漸變層的顏色狱意,隨機(jī)顏色漸變
gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor];
//mask原理:默認(rèn)會(huì)顯示mask層底部的內(nèi)容,如果漸變層放在mask層上拯欧,就不會(huì)顯示了
// 添加漸變層到控制器的view圖層上
[self.view.layer addSublayer:gradientLayer];
// mask層工作原理:按照透明度裁剪详囤,只保留非透明部分,文字就是非透明的镐作,因此除了文字藏姐,其他都被裁剪掉,這樣就只會(huì)顯示文字下面漸變層的內(nèi)容该贾,相當(dāng)于留了文字的區(qū)域羔杨,讓漸變層去填充文字的顏色。
// 設(shè)置漸變層的裁剪層
self.gradientLayer.mask = label.layer;
// 父層改了杨蛋,坐標(biāo)系也就改了兜材,需要重新設(shè)置label的位置,才能正確的設(shè)置裁剪區(qū)域逞力。
label.frame = self.gradientLayer.bounds;
參考文檔
(https://www.cnblogs.com/YouXianMing/p/3793913.html)這篇寫的很詳細(xì)
(http://www.reibang.com/p/0c785ee7ef35)這篇也很好