iOS一分鐘學(xué)會環(huán)形進(jìn)度條

有幾篇博客寫到了怎么實(shí)現(xiàn)環(huán)形進(jìn)度條重付,大多是使用Core Graph來實(shí)現(xiàn),實(shí)現(xiàn)比較麻煩且效率略低凫乖,只是一個小小的進(jìn)度條而已堪夭,我們當(dāng)然是用最簡單而且效率高的方式來實(shí)現(xiàn)。
先看一下這篇博客拣凹,博客地址:http://www.brighttj.com/ios/ios-implement-loop-progress.html
這篇博客寫的不錯森爽,不過看上去還是略微復(fù)雜了,我自己根據(jù)自己的思路整理了一下嚣镜,當(dāng)然目的是為了更加簡潔易懂爬迟。

一:先制作一個不帶顏色漸變的進(jìn)度條

自定義一個cycleView,在.m 中實(shí)現(xiàn)drawRect方法

- (void)drawRect:(CGRect)rect {
    
    CGContextRef ctx = UIGraphicsGetCurrentContext();//獲取上下文
    
    CGPoint center = CGPointMake(100, 100);  //設(shè)置圓心位置
    CGFloat radius = 90;  //設(shè)置半徑
    CGFloat startA = - M_PI_2;  //圓起點(diǎn)位置
    CGFloat endA = -M_PI_2 + M_PI * 2 * _progress;  //圓終點(diǎn)位置
    
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
    
    CGContextSetLineWidth(ctx, 10); //設(shè)置線條寬度
    [[UIColor blueColor] setStroke]; //設(shè)置描邊顏色
    
    CGContextAddPath(ctx, path.CGPath); //把路徑添加到上下文
    
    CGContextStrokePath(ctx);  //渲染

}

<br />

因?yàn)閐rawRect方法只是在視圖剛剛出現(xiàn)的時(shí)候執(zhí)行一次菊匿,所以我們需要使用

[self setNeedsDisplay];<br />

這個方法來進(jìn)行重新繪制付呕,
在控制器里面加一個slider,滑動slider來控制進(jìn)度變化

- (void)drawProgress:(CGFloat )progress
{
    _progress = progress;
    [self setNeedsDisplay];
}

看一下效果

0.png

如果進(jìn)度條不需要加漸變色跌捆,那么這兒幾行代碼就完成了徽职。

下面來實(shí)現(xiàn)一下帶有漸變色的進(jìn)度條,原理很簡單佩厚,剛剛畫的是一條默認(rèn)是黑色的線條姆钉,我們把黑色替換成一條漸變色的線條就可以了。
環(huán)形漸變色線條的制作:

第一步

使用CAShapeLayer繪制出漸變層抄瓦,應(yīng)為它只能指定兩個點(diǎn)之間進(jìn)行漸變潮瓶,所以這里需要兩個CAShapeLayer,左邊一個和右邊一個钙姊,看一下效果圖

3.jpg

代碼實(shí)現(xiàn)


//生成漸變色
    CALayer *gradientLayer = [CALayer layer];
    
    //左側(cè)漸變色
    CAGradientLayer *leftLayer = [CAGradientLayer layer];
    leftLayer.frame = CGRectMake(0, 0, self.bounds.size.width / 2, self.bounds.size.height);    // 分段設(shè)置漸變色
    leftLayer.locations = @[@0.3, @0.9, @1];
    leftLayer.colors = @[(id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor];
    [gradientLayer addSublayer:leftLayer];
    
    //右側(cè)漸變色
    CAGradientLayer *rightLayer = [CAGradientLayer layer];
    rightLayer.frame = CGRectMake(self.bounds.size.width / 2, 0, self.bounds.size.width / 2, self.bounds.size.height);
    rightLayer.locations = @[@0.3, @0.9, @1];
    rightLayer.colors = @[(id)[UIColor yellowColor].CGColor, (id)[UIColor redColor].CGColor];
    [gradientLayer addSublayer:rightLayer];
    

這個漸變層只是一個中間變量毯辅,是不能顯示出來的,我這里只是演示一下煞额,現(xiàn)在我們已經(jīng)拿到了漸變層gradientLayer思恐。

第二步

我們需要制作一個環(huán)形路徑
先看一下效果:


2.jpg

代碼實(shí)現(xiàn):

CGPoint center = CGPointMake(100, 100);
    CGFloat radius = 90;
    CGFloat startA = - M_PI_2;  //設(shè)置進(jìn)度條起點(diǎn)位置
    CGFloat endA = -M_PI_2 + M_PI * 2 * _progress;  //設(shè)置進(jìn)度條終點(diǎn)位置
    
    //獲取環(huán)形路徑(畫一個圓形,填充色透明膊毁,設(shè)置線框?qū)挾葹?0胀莹,這樣就獲得了一個環(huán)形)
    _progressLayer = [CAShapeLayer layer];//創(chuàng)建一個track shape layer
    _progressLayer.frame = self.bounds;
    _progressLayer.fillColor = [[UIColor clearColor] CGColor];  //填充色為無色
    _progressLayer.strokeColor = [[UIColor redColor] CGColor]; //指定path的渲染顏色,這里可以設(shè)置任意不透明顏色
    _progressLayer.opacity = 1; //背景顏色的透明度
    _progressLayer.lineCap = kCALineCapRound;//指定線的邊緣是圓的
    _progressLayer.lineWidth = 10;//線的寬度
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];//上面說明過了用來構(gòu)建圓形
    _progressLayer.path =[path CGPath]; //把path傳遞給layer,然后layer會處理相應(yīng)的渲染媚媒,整個邏輯和CoreGraph是一致的嗜逻。
    [self.layer addSublayer:_progressLayer];

第三步,也是最后一步了

用我們在第二步生成的環(huán)形路徑去截取第一步生成的漸變層

[gradientLayer setMask:_progressLayer]; //用progressLayer來截取漸變層
self.layer addSublayer:gradientLayer];

截取的layer層就是我們最后需要的缭召,看一看我們最后截取后得到的

4.jpg

到這里栈顷,我們已經(jīng)完成了99%了,最后一步嵌巷,根據(jù)自己的需要讓它顯示多少的比例就完成了萄凤。比例的控制在第二部的progress屬性,比例在0-1之間搪哪,看一看最后的效果靡努。

1.jpg

demo下載地址

更多原創(chuàng)文章可以看 我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晓折,隨后出現(xiàn)的幾起案子惑朦,更是在濱河造成了極大的恐慌,老刑警劉巖漓概,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾月,死亡現(xiàn)場離奇詭異,居然都是意外死亡胃珍,警方通過查閱死者的電腦和手機(jī)梁肿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觅彰,“玉大人吩蔑,你說我怎么就攤上這事√钐В” “怎么了烛芬?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飒责。 經(jīng)常有香客問我蛀骇,道長,這世上最難降的妖魔是什么读拆? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任擅憔,我火速辦了婚禮,結(jié)果婚禮上檐晕,老公的妹妹穿的比我還像新娘暑诸。我一直安慰自己,他們只是感情好辟灰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布个榕。 她就那樣靜靜地躺著,像睡著了一般芥喇。 火紅的嫁衣襯著肌膚如雪西采。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天继控,我揣著相機(jī)與錄音械馆,去河邊找鬼胖眷。 笑死,一個胖子當(dāng)著我的面吹牛霹崎,可吹牛的內(nèi)容都是我干的珊搀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼尾菇,長吁一口氣:“原來是場噩夢啊……” “哼境析!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起派诬,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤劳淆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后默赂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛鸵,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年放可,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谒臼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡耀里,死狀恐怖蜈缤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冯挎,我是刑警寧澤底哥,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站房官,受9級特大地震影響趾徽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翰守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一孵奶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜡峰,春花似錦了袁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至油航,卻和暖如春崭庸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工怕享, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留执赡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓熬粗,卻偏偏與公主長得像搀玖,于是被迫代替她去往敵國和親余境。 傳聞我的和親對象是個殘疾皇子驻呐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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