iOS 制作漸變虛線圓環(huán)

最近學(xué)習(xí)顏色漸變和制作虛線的相關(guān)知識(shí)吹由,總結(jié)一下以便自己學(xué)習(xí)和多多交流朱嘴。

效果圖:
效果圖.jpeg

新建項(xiàng)目之后:

第一步:在storyBoard添加slider控件設(shè)置位置和初始值為0.5,添加slider的拖拽事件- (IBAction)changeProgress:(UISlider *)slider 到viewController.m级乍,可以獲得slider的數(shù)值變化帚湘。

第二步:新建一個(gè)繼承自UIView的文件CircleView,用來(lái)封裝虛線和圓環(huán)大诸。

如上圖效果中:灰色的圓環(huán)和虛線是不需要考慮進(jìn)度條的顏色變化贯卦,可以單獨(dú)繪制焙贷;橘色的圓環(huán)和彩色虛線要根據(jù)slider進(jìn)度條變化,制作時(shí)需要獲得進(jìn)度填的數(shù)值啡彬,所以首先繪制灰色的圓環(huán)和虛線故硅。

1 ->灰色圓環(huán)和虛線 在CircleView的drawRect:方法中

 //繪制灰色圓環(huán)

    UIBezierPath *lightGary = [UIBezierPath bezierPathWithArcCenter:CGPointMake(120, 120) radius:110 startAngle:-M_PI endAngle:M_PI  clockwise:YES];    
    lightGary.lineWidth = 5;
    [[UIColor lightGrayColor] setStroke];
    [lightGary stroke];//連接各個(gè)點(diǎn)

  //繪制灰色虛線圓
    /*
     context – 繪制上下文
     phase - 虛線繪制開(kāi)始時(shí)跳過(guò)幾個(gè)點(diǎn)
     lengths – 指明虛線是如何交替繪制,具體看例子
     count – lengths數(shù)組的長(zhǎng)度
     */

    CGContextRef context = UIGraphicsGetCurrentContext();//獲取上下文
    CGContextSetLineCap(context, kCGLineCapRound);//設(shè)置線條樣式
    CGContextSetLineWidth(context, 3);//設(shè)置線條寬度
    CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);//設(shè)置顏色
    CGContextBeginPath(context);//開(kāi)始繪制
    CGFloat length[] = {5,5};//表示先繪制5個(gè)點(diǎn)往踢,再跳過(guò)5個(gè)點(diǎn)
    UIBezierPath *dashLine = [UIBezierPath bezierPathWithArcCenter:CGPointMake(120, 120) radius:100 startAngle:-M_PI_2 endAngle:M_PI *3/2 clockwise:YES];
     CGContextSetLineDash(context, 0, length, 2);//虛線的起始點(diǎn)
    CGContextAddPath(context, dashLine.CGPath);
    CGContextStrokePath(context);//繪制
    CGContextClosePath(context);//關(guān)閉圖像

在viewController.m文件添加CircleView的對(duì)象就可顯示徘层,如圖:
灰色圓環(huán)虛線.jpeg

2 ->獲取slider的數(shù)據(jù)變化
在CircleView.h設(shè)置全局變量 progress,在ViewController獲取slider的數(shù)值變化

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
    self.circleProgress = [[CircleView alloc]initWithFrame:CGRectMake(70, 50, 250, 250)];
    self.circleProgress.backgroundColor = [UIColor blackColor];
    [self.view addSubview:_circleProgress];
    
    _circleProgress.progress = _slider.value;//獲取初始值
}

- (IBAction)sliderChange:(UISlider*)sender {
    NSLog(@"%f",sender.value);
    _circleProgress.progress = sender.value;
    [_circleProgress setNeedsDisplay];//slider值變化時(shí)重繪_circleProgress
}

3 ->繪制橘色圓環(huán)(和灰色圓環(huán)差不多瘦癌,此代碼寫(xiě)在繪制灰色虛線代碼之前英支,否則圓環(huán)顯示虛線)
startAngle:圓環(huán)繪制開(kāi)始位置(-M_PI_2 :12點(diǎn)鐘的位置哮伟,-90度)
endAngle:圓環(huán)結(jié)束為止

  //畫(huà)橘色的圓環(huán)
    UIBezierPath *orange = [UIBezierPath bezierPathWithArcCenter:CGPointMake(120, 120) radius:110 startAngle:-M_PI_2 endAngle:-M_PI_2 + M_PI *2 *_progress clockwise:YES];
    orange.lineWidth = 4;
    [[UIColor orangeColor] setStroke];
    [orange stroke];

4->繪制漸變色虛線

   //    繪制彩色虛線
    CGContextRef contextColor = UIGraphicsGetCurrentContext();//獲取上下文
    CGContextSetLineCap(contextColor, kCGLineCapRound);//設(shè)置線條樣式
    CGContextSetLineWidth(contextColor, 3);//設(shè)置線條寬度
    CGContextBeginPath(contextColor);//開(kāi)始繪制
    
    CGContextSetLineDash(contextColor, 0, length, 2);//虛線的起始點(diǎn)
    CGContextAddArc(contextColor, 120, 120, 100,-M_PI_2 , -M_PI_2 + M_PI *2 *_progress, 0);
    
    
   //以下是使用CGGradientRef 進(jìn)行漸變色替換
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //創(chuàng)建RGB色彩空間
    NSArray *colorArray = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor];
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colorArray, NULL);
    CGColorSpaceRelease(colorSpace);
    colorSpace = NULL;
    //將context中的路徑替換成路徑的描邊版本楞黄,使用參數(shù)context去計(jì)算路徑(即創(chuàng)建新的路徑是原來(lái)路徑的描邊)。用恰當(dāng)?shù)念伾畛涞玫降穆窂綄a(chǎn)生類似繪制原來(lái)路徑的效果鬼廓。
    CGContextReplacePathWithStrokedPath(contextColor);
    CGContextClip(contextColor);
      /*
     CGGradientRef  線性漸變      參數(shù)意思:
     Graphics context 指定用于繪制線性漸變的圖形上下文。
     CGGradientRef  線性漸變對(duì)象
     startPoint  漸變開(kāi)始位置  endPoint  漸變結(jié)束位置
     Gradient drawing options 當(dāng)你的起點(diǎn)或者終點(diǎn)不在圖形上下文的邊緣內(nèi)時(shí)尤慰,指定該如何處理。你可以使用你的開(kāi)始或結(jié)束顏色來(lái)填充漸變以外的空間伟端。此參數(shù)為以下值之一:KCGGradientDrawsAfterEndLocation擴(kuò)展整個(gè)漸變到漸變的終點(diǎn)之后的所有點(diǎn) KCGGradientDrawsBeforeStartLocation擴(kuò)展整個(gè)漸變到漸變的起點(diǎn)之前的所有點(diǎn)匪煌。0不擴(kuò)展該漸變党巾。
     */
    CGContextDrawLinearGradient(contextColor, gradient, CGPointMake(0, rect.size.height / 2), CGPointMake(rect.size.width, rect.size.height / 2), 0);

//   CGContextDrawRadialGradient(contextColor, gradient, CGPointMake(50, 150), 5, CGPointMake(150, 150),150,kCGGradientDrawsAfterEndLocation);// CGGradientRef  圓形漸變
    CGGradientRelease(gradient);

到此已經(jīng)制作出虛線漸變的進(jìn)度效果圖了霜医,顏色漸變還有一種可以用CAGradientLayer實(shí)現(xiàn)(只有線性漸變),有時(shí)間可以自行學(xué)習(xí)一下署海。

如有哪里不對(duì)歡迎大家批評(píng)指正,感謝叹侄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昨登,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丰辣,更是在濱河造成了極大的恐慌,老刑警劉巖飘哨,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琐凭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡统屈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門腕扶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吨掌,“玉大人,你說(shuō)我怎么就攤上這事膜宋。” “怎么了秋茫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乘瓤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)衙傀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任统抬,我火速辦了婚禮,結(jié)果婚禮上聪建,老公的妹妹穿的比我還像新娘。我一直安慰自己擎析,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布揍魂。 她就那樣靜靜地躺著棚瘟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偎蘸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天限书,我揣著相機(jī)與錄音,去河邊找鬼蔗包。 笑死秉扑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的误澳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忆谓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踱承!你這毒婦竟也來(lái)了哨免?” 一聲冷哼從身側(cè)響起昙沦,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盾饮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體普办,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徘钥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呈础。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贞远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓝仲,到底是詐尸還是另有隱情,我是刑警寧澤袱结,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布途凫,位于F島的核電站,受9級(jí)特大地震影響维费,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犀盟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倡怎。 院中可真熱鬧,春花似錦监署、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缓熟。三九已至,卻和暖如春够滑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彰触。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留分蓖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓么鹤,卻偏偏與公主長(zhǎng)得像味廊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子余佛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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