iOS實(shí)踐:根據(jù)進(jìn)度繪制進(jìn)度條走敌、進(jìn)度扇形碴倾、進(jìn)度球

在這濃濃的鞭炮聲中,迎來了這個(gè)系列的最后一篇掉丽。哈哈~這是多么有紀(jì)念意義的春節(jié)呀跌榔。

今天我們來寫一個(gè)小小的Demo,來演練一下通過OC繪圖捶障,根據(jù)進(jìn)度自己繪制出來一個(gè)進(jìn)度條僧须,或者進(jìn)度扇形、進(jìn)度球形项炼。

在此之前担平,分享了一些關(guān)于繪圖方面的基礎(chǔ)《Р浚可以通過傳輸門快捷進(jìn)入:

1.繪圖系列之:使用Quartz2D進(jìn)行繪圖

2.繪圖系列之:Quartz2D進(jìn)行渲染

3.繪圖系列之:OC繪制基本圖形

4.繪圖系列之:OC繪制餅狀圖暂论、柱狀圖和扇形圖

1. 效果展示及思維導(dǎo)圖

效果展示:


效果展示.gif

思維導(dǎo)圖:


進(jìn)度條、進(jìn)度扇形拌禾、進(jìn)度球的思維導(dǎo)圖.png

2. 項(xiàng)目準(zhǔn)備工作

  1. 為了省事取胎,我們所有的繪圖都是在SotryBoard上面進(jìn)行。如果有興趣的同學(xué)可以自己通過代碼約束的方式實(shí)現(xiàn)蹋砚。
  2. 用一個(gè)UISlider來模擬進(jìn)度下載扼菠,這樣可以通過拖動(dòng)滑桿摄杂,感受到下載的過程坝咐。
  3. 實(shí)際開發(fā)中的提醒:在實(shí)際中,下載進(jìn)度通常都不會放在主線程上析恢,所以子線程獲得下載的進(jìn)度之后墨坚,不要忘記回到主線程刷新UI。
  4. 我們這些模擬都是通過滑桿的,所以所有的操作不涉及到多線程泽篮。

3. 進(jìn)度條的實(shí)現(xiàn)

  1. 進(jìn)度條我們這里就直接使用了SB的UIProgressView這個(gè)控件盗尸。如果覺得不好看的同學(xué),可以通過自定義線段+Label的方式實(shí)現(xiàn)帽撑。繪制線段的部分可以參考上一篇分享里面有泼各,同時(shí)也可以參考下面繪制扇形或者球形進(jìn)度指示器的部分。

  2. 安全賦值

  • 我們通晨骼看到的下載進(jìn)度都是0%~100%這種表達(dá)方式扣蜻,所以表示下載進(jìn)度的數(shù)值范圍是0~1.
  • 然而UISlider的范圍是可以自定義的,所以我們需要做一下數(shù)值的安全處理及塘,讓最終下載進(jìn)度的數(shù)值范圍在0~1之間莽使。

一行代碼搞定:


@property (weak, nonatomic) IBOutlet UIProgressView *lineView;

- (IBAction)sliderValueChanged:(UISlider *)sender {
    
    //    對進(jìn)度條進(jìn)行賦值,同時(shí)對數(shù)值進(jìn)行安全處理
    self.lineView.progress  =  (sender.value - sender.minimumValue) / (sender.maximumValue - sender.minimumValue);
}

完成效果:


progressLine.gif

4. 扇形進(jìn)度指示器

  1. 定義扇形的中心笙僚、扇形的半徑芳肌、扇形的起點(diǎn);
  2. 計(jì)算扇形的結(jié)束位置:起點(diǎn) + 進(jìn)度百分比*2PI
  3. 根據(jù)起始點(diǎn)肋层、原點(diǎn)亿笤、半徑繪制弧線.
  4. 從弧線結(jié)束為止繪制一條線段到圓心。這樣系統(tǒng)會自動(dòng)閉合圖形栋猖,繪制一條從圓心到弧線起點(diǎn)的線段责嚷。
  5. 設(shè)置扇形的填充模式、填充顏色掂铐。
  6. 給View設(shè)置一個(gè)進(jìn)度的屬性罕拂,用來讓外界賦值。
  7. 重新進(jìn)度屬性的set方法全陨,為的是給進(jìn)度賦值的時(shí)候可以時(shí)時(shí)刷新UI爆班,同時(shí)用文字Label顯示進(jìn)度的具體數(shù)值。
    代碼如下:

@interface SectorProgress : UIView
@property(assign,nonatomic)CGFloat progress;
@property(weak,nonatomic) IBOutlet UILabel *progressLabel;

@end


- (void)drawRect:(CGRect)rect {
//    定義扇形中心
    CGPoint origin = CGPointMake(100, 100);
//    定義扇形半徑
    CGFloat radius = 100.0f;
    
//    設(shè)定扇形起點(diǎn)位置
    CGFloat startAngle = - M_PI_2;
//    根據(jù)進(jìn)度計(jì)算扇形結(jié)束位置
    CGFloat endAngle = startAngle + self.progress * M_PI * 2;
    
//    根據(jù)起始點(diǎn)辱姨、原點(diǎn)柿菩、半徑繪制弧線
    UIBezierPath *sectorPath = [UIBezierPath bezierPathWithArcCenter:origin radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
    
//    從弧線結(jié)束為止繪制一條線段到圓心。這樣系統(tǒng)會自動(dòng)閉合圖形雨涛,繪制一條從圓心到弧線起點(diǎn)的線段枢舶。
    [sectorPath addLineToPoint:origin];
    
//    設(shè)置扇形的填充顏色
    [[UIColor darkGrayColor] set];
    
//    設(shè)置扇形的填充模式
    [sectorPath fill];
}


//重寫progress的set方法,可以在賦值的同時(shí)給label賦值
- (void)setProgress:(CGFloat)progress{
    _progress = progress;
    
//    對label進(jìn)行賦值
    self.progressLabel.text = [NSString stringWithFormat:@"%0.2f%%",progress * 100];
//    賦值結(jié)束之后要刷新UI替久,不然看不到扇形的變化
    [self setNeedsDisplay];
}

完成效果:

sectorProgress.gif

5. 球形指示器

球形指示器幾乎和扇形的一樣凉泄,只是在繪制的時(shí)候計(jì)算角度稍稍有點(diǎn)點(diǎn)點(diǎn)點(diǎn)不一樣而已。

  1. 定義扇形的中心蚯根、扇形的半徑后众;
  2. 定義起始點(diǎn)位置的屬性,用來賦值;
  3. 根據(jù)起始點(diǎn)蒂誉、原點(diǎn)教藻、半徑繪制弧線.
  4. 系統(tǒng)會自動(dòng)的從起點(diǎn)到終點(diǎn)進(jìn)行閉合,形成一個(gè)球形右锨。
  5. 設(shè)置球形的填充模式括堤、填充顏色。
  6. 為了讓球形看起來更自然绍移,要在球形的外面填充一個(gè)空心描邊的圓形痊臭。
  7. 給View設(shè)置一個(gè)進(jìn)度的屬性,用來讓外界賦值登夫。
  8. 重新進(jìn)度屬性的set方法广匙,這里和扇形指示器有一點(diǎn)點(diǎn)不一樣。在這里我們需要根據(jù)進(jìn)度計(jì)算球形的起始位置恼策,同時(shí)刷新UI鸦致,對文字Label進(jìn)行賦值。

球形是從下往上進(jìn)行增長的涣楷,所以計(jì)算角度的時(shí)候起點(diǎn)要從PI/2開始分唾。

@interface BallProgress ()
@property(assign,nonatomic)CGFloat progress;
@property(assign,nonatomic)CGFloat startAngle;
@property(assign,nonatomic)CGFloat endAngle;

@property(weak,nonatomic) IBOutlet UILabel *progressLabel;


@end

- (void)drawRect:(CGRect)rect {
    CGPoint origin = CGPointMake(100, 100);
    CGFloat radius = 95.0f;
    
    UIBezierPath *ballPath = [UIBezierPath bezierPathWithArcCenter:origin radius:radius startAngle:_startAngle endAngle:_endAngle clockwise:YES];
    
    [[UIColor purpleColor]set];
    [ballPath fill];
    
//    在球形的外面繪制一個(gè)描邊空心的圓形,不然很難看
    UIBezierPath *strokePath = [UIBezierPath bezierPathWithArcCenter:origin radius:radius startAngle:0 endAngle:-0.00000001 clockwise:YES];
    [[UIColor lightGrayColor]set];
    [strokePath stroke];
}


- (void)setProgress:(CGFloat)progress{
    _progress = progress;
    
//    設(shè)置起始點(diǎn)狮斗,位置是根據(jù)進(jìn)度動(dòng)態(tài)變換的
    self.startAngle = M_PI_2 - progress * M_PI;
    self.endAngle = M_PI_2 + progress * M_PI;
    
    self.progressLabel.text = [NSString stringWithFormat:@"%0.2f%%",progress * 100];
    
    [self setNeedsDisplay];
}

最終完成效果:

ballProgress.gif

源代碼下載地址

好了绽乔,過年不戳更,新年有大吉~加油碳褒!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末折砸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沙峻,更是在濱河造成了極大的恐慌睦授,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摔寨,死亡現(xiàn)場離奇詭異去枷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)是复,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門删顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淑廊,你說我怎么就攤上這事逗余。” “怎么了蒋纬?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵猎荠,是天一觀的道長。 經(jīng)常有香客問我蜀备,道長关摇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任碾阁,我火速辦了婚禮输虱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脂凶。我一直安慰自己宪睹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布蚕钦。 她就那樣靜靜地躺著亭病,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘶居。 梳的紋絲不亂的頭發(fā)上罪帖,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音邮屁,去河邊找鬼整袁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佑吝,可吹牛的內(nèi)容都是我干的坐昙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼芋忿,長吁一口氣:“原來是場噩夢啊……” “哼炸客!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戈钢,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚷量,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逆趣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶溶,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年宣渗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抖所。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痕囱,死狀恐怖田轧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鞍恢,我是刑警寧澤傻粘,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布每窖,位于F島的核電站,受9級特大地震影響弦悉,放射性物質(zhì)發(fā)生泄漏窒典。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一稽莉、第九天 我趴在偏房一處隱蔽的房頂上張望瀑志。 院中可真熱鬧,春花似錦污秆、人聲如沸劈猪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽战得。三九已至,卻和暖如春庸推,著一層夾襖步出監(jiān)牢的瞬間贡避,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工予弧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刮吧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓掖蛤,卻偏偏與公主長得像杀捻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚓庭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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