先上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