iOS 自定義比例的圓弧繪制并旋轉(zhuǎn)、圓形進(jìn)度條與速度表盤Demo

先上Demo地址

圓形進(jìn)度條:https://github.com/DrunkenMouse/-

速度表盤:https://github.com/DrunkenMouse/speed

正文:

前不久的前不久,有一個(gè)哥們問了我這么一個(gè)問題:

用三個(gè)不同顏色的等比例圓弧拼成一個(gè)圓怎么畫致稀?

當(dāng)時(shí)我很認(rèn)真的想了想后不解的反問他:為什么不把一個(gè)圓等比例的分成三份,每一份的顏色不同那?

我看到他貌似思索了一下后皺了皺眉頭:也對(duì)啊乖坠。。那你會(huì)嗎刀闷?

然后我就寫了這么一份Demo出來了熊泵,想分成幾份就分成幾份 畫完之后還會(huì)自動(dòng)旋轉(zhuǎn)。

就連圓弧的顏色都是隨機(jī)產(chǎn)生的~

原理很簡單甸昏,先初始化開始角度與結(jié)束角度為0

隨后通過接收到的要求繪制的圓弧量Num來實(shí)現(xiàn)一個(gè)for循環(huán)

//初始化起點(diǎn)位置

CGFloat startAngle = 0.0;

//初始化結(jié)束位置

CGFloat endAngle = 0.0;

//通過for循環(huán)繪制圓弧

for (int i=0;i<num;i++){

}

在for循環(huán)的內(nèi)部

書寫圓弧的繪制與動(dòng)畫效果

//每個(gè)圓弧的顏色隨機(jī)產(chǎn)生并設(shè)置繪制色為隨機(jī)色

UIColor *color = [UIColor colorWithRed:((float)arc4random_uniform(256)/255.0) green:((float)arc4random_uniform(256)/255.0) blue:((float)arc4random_uniform(256)/255.0) alpha:1.0];

//每次繪制時(shí)顽分,開始角度為上次的結(jié)束角度

startAngle = endAngle;

//每次繪制的結(jié)束角度為360°/num+開始角度

endAngle =? M_PI*2/num + startAngle;

//獲取當(dāng)前View的中心,用self.center會(huì)出錯(cuò)

CGPoint centers = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

//設(shè)置貝茲路徑

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:centers radius:100 startAngle:startAngle endAngle:endAngle clockwise:1];

//畫一根到 圓心的線

[path addLineToPoint:centers];

//通過layer繪制

CAShapeLayer *layer = [CAShapeLayer layer];

layer.path = path.CGPath;

//設(shè)置填充色為自定義顏色

layer.fillColor = color.CGColor;

//開始繪制

[self.layer addSublayer:layer];

//添加一個(gè)動(dòng)畫為旋轉(zhuǎn)

CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];

//旋轉(zhuǎn)的時(shí)間

basic.duration = 10;

//旋轉(zhuǎn)的角度

CGFloat angle? = M_PI * 10;

basic.toValue = @(angle);

//旋轉(zhuǎn)的模式

basic.timingFunction = [CAMediaTimingFunction functionWithName:@"default"];

//給自身添加旋轉(zhuǎn)動(dòng)畫

[self.layer addAnimation:basic forKey:@"animation"];

而后直接調(diào)用此方法傳入要求繪制的數(shù)量Num就可以畫出了施蜜。


然后我那哥們看了看后沉思許久卒蘸,又問我:那你能不能動(dòng)態(tài)的繪制一個(gè)圓形進(jìn)度條出來?

我想了想翻默,而后又反問他:這個(gè)缸沃,難嗎?

于是又一份Demo出來了:

關(guān)于滑動(dòng)條Slider的數(shù)值改變而繪制相對(duì)應(yīng)的圓弧

首先需要定義一個(gè)View修械,并設(shè)置一個(gè)屬性progress

而后通過在slider的ValueChange調(diào)用的方法里對(duì)屬性progress進(jìn)行賦值

-(void)sliderValueChange:(UISlider *)sender{

//修改繪制路徑View的進(jìn)度

self.proView.progress = sender.value;

}

隨后通過重寫progress的set方法來繪制對(duì)應(yīng)的圓弧

//圓心

CGPoint centers = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

//起點(diǎn)位置

CGFloat startAngle = 0;

//結(jié)束位置? ? ? ? 進(jìn)度條的數(shù)據(jù) * 360 度

CGFloat endAngle = self.progress * M_PI * 2 + startAngle;? //默認(rèn)是 0;

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:centers radius:100 startAngle:startAngle endAngle:endAngle clockwise:1];

//畫一根到 圓心的線

[path addLineToPoint:centers];

//通過layer繪制

CAShapeLayer *layer = [CAShapeLayer layer];

layer.path = path.CGPath;

layer.fillColor = [UIColor blueColor].CGColor;

//給自身Layer添加并保存自定義的Layer

[self.layer addSublayer:layer];

self.layers = layer;



而后當(dāng)我把這份Demo交給我那哥們的時(shí)候和泌,我那哥們又問了。

哥們:那個(gè)祠肥。武氓。最近又有新要求了梯皿,你能幫我寫個(gè)速度表盤嗎?

我:县恕。东羹。。忠烛。属提。

我:你說什么?美尸!風(fēng)太大我聽不見冤议!對(duì)了我還有事!先撤了师坎!

然而即使如此恕酸,我還是寫了一個(gè)表盤出來


詳情可以參考這位大大的講解:http://www.reibang.com/p/7655315620f7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胯陋,隨后出現(xiàn)的幾起案子蕊温,更是在濱河造成了極大的恐慌,老刑警劉巖遏乔,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义矛,死亡現(xiàn)場離奇詭異,居然都是意外死亡盟萨,警方通過查閱死者的電腦和手機(jī)凉翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捻激,“玉大人噪矛,你說我怎么就攤上這事∑贪眨” “怎么了艇挨?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長韭赘。 經(jīng)常有香客問我缩滨,道長,這世上最難降的妖魔是什么泉瞻? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任脉漏,我火速辦了婚禮,結(jié)果婚禮上袖牙,老公的妹妹穿的比我還像新娘侧巨。我一直安慰自己,他們只是感情好鞭达,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布司忱。 她就那樣靜靜地躺著皇忿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坦仍。 梳的紋絲不亂的頭發(fā)上鳍烁,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音繁扎,去河邊找鬼幔荒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梳玫,可吹牛的內(nèi)容都是我干的爹梁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼提澎,長吁一口氣:“原來是場噩夢啊……” “哼姚垃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虱朵,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤莉炉,失蹤者是張志新(化名)和其女友劉穎钓账,沒想到半個(gè)月后碴犬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梆暮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年服协,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦粹。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偿荷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唠椭,到底是詐尸還是另有隱情跳纳,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布贪嫂,位于F島的核電站寺庄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏力崇。R本人自食惡果不足惜斗塘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亮靴。 院中可真熱鬧馍盟,春花似錦、人聲如沸茧吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至曹步,卻和暖如春宪彩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讲婚。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工尿孔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筹麸。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓活合,卻偏偏與公主長得像,于是被迫代替她去往敵國和親物赶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子白指,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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