OC繪制餅狀圖节腐、柱狀圖和扇形圖

原文鏈接

這一篇就應該是繪圖這個系列的基礎中最后一篇了,然后孩擂,然后就過年啦O浒尽!T槿稀糕伐!
在此之前良瞧,分享了一些關于繪圖方面的基礎≈吭可以通過傳輸門快捷進入:

1.繪圖系列之:使用Quartz2D進行繪圖

2.繪圖系列之:Quartz2D進行渲染

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

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

其實堅持更新真的對自己而言還算是蠻挑戰(zhàn)的一件事情尘执,重點在于堅持宴凉。每一次有點贊弥锄,和回復都讓自己感覺非常棒。知識就是用來分享的温治,這就是開源越來越讓人著迷的地方戒悠。

好了,來吧~Come on~

1. 繪制柱狀圖bar chart

  • 獲取數組中對于每個柱狀圖的樹枝
  • 計算柱子的寬度
  • 循環(huán)計算每根柱子的高度卤恳、X/Y
  • 繪制矩形
  • 設置顏色
  • 填充

下面模擬一個數組突琳,繪制柱狀圖。
完成后的樣子:

柱狀圖片.png

首先我們要獲取數組中常用的一些數值,有一些常見的手法:

NSArray *arry = @[@300,@232.233,@324.324,@34,@4352,@43.0];

// 找出數組中的最大數值 
CGFloat maxValue = [[arry valueForKeyPath:@"@max.floatValue"] floatValue];

// 重點在這句話上
// @”@max.floatValue”(獲取最大值)镜豹,
// @”@min.floatValue”(獲取最小值)逛艰,
// @”@avg.floatValue” (獲取平均值)躏碳,
// @”@count.floatValue”(獲取數組大小)
// @”@sum.floatValue”(獲取數組總和)
- (void)drawRect:(CGRect)rect{
    NSArray *arry = @[@300,@232.233,@324.324,@34,@435,@43.0];

//    計算bar的寬度
    CGFloat barW = self.bounds.size.width / (arry.count * 2 - 1);

//    找出數組中的最大數值
    CGFloat maxValue = [[arry valueForKeyPath:@"@max.floatValue"] floatValue];

    for (NSInteger i = 0; i < arry.count; i++) {
//        計算bar的高度
    CGFloat barH = [arry[i] floatValue] * (self.bounds.size.height * BAR_HEIGHT_COEFFICIENT/ maxValue);

//        計算bar的XY
        CGFloat barX = barW * i * 2;
        CGFloat barY = self.bounds.size.height - barH;

//        繪制矩形
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(barX, barY, barW, barH)];

//        給矩形添加隨機色
        [[self randomUIColor] set];

        [path fill];


    }
}

- (UIColor *)randomUIColor{
    UIColor *color = [UIColor colorWithRed:(arc4random_uniform(256) / 255.0) green:(arc4random_uniform(256) / 255.0) blue:(arc4random_uniform(256) / 255.0) alpha:(arc4random_uniform(256) / 255.0)];
    return color;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [self setNeedsDisplay];
}

2. 繪制餅圖Pie Chart

完成后的樣子:

餅狀圖.png
- (void)drawRect:(CGRect)rect {
    // Drawing code

    NSArray *arry = @[@300,@232.233,@324.324,@34,@4352,@43.0];

//    計算數組中所有數值之和
    CGFloat sumValue = [[arry valueForKeyPath:@"@sum.floatValue"] floatValue];

//設定圓弧的圓點、起始弧度
    CGPoint origin = CGPointMake(150, 150);
    CGFloat startAngle = 0;
    CGFloat endAngle = 0;


    for (NSInteger i = 0 ; i < arry.count; i++) {

//        每個數據的弧度
        CGFloat angle = [arry[i] floatValue] * M_PI * 2 / sumValue;

//        計算這一段弧度的結束為止
        endAngle = startAngle + angle;

        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:origin radius:130 startAngle:startAngle endAngle:endAngle clockwise:YES];

//        計算下一段弧度開始的位置
        startAngle = endAngle;

//        從弧邊散怖,繪制到原點菇绵。用于封閉路徑,可以繪制扇形
        [path addLineToPoint:origin];
        //        給扇形添加隨機色
        [[self randomUIColor] set];
        [path fill];
    }

}

- (UIColor *)randomUIColor{
    UIColor *color = [UIColor colorWithRed:(arc4random_uniform(256) / 255.0) green:(arc4random_uniform(256) / 255.0) blue:(arc4random_uniform(256) / 255.0) alpha:(arc4random_uniform(256) / 255.0)];
    return color;
}
//觸屏后重新渲染
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self setNeedsDisplay];
}

3. 繪制進度條和進度扇形

本來也想像柱狀圖镇眷、餅狀圖一樣的寫法咬最,但是想想其實可以做的更形象一點。所以打算下一篇專門寫一下如何用扇形來表達一個下載進度欠动。實現后的效果如下:

rightImage.gif

4. 神秘感增強器:IB_DESIGNABLE和IBInspectable

  • IB_DESIGNABLE的宏的功能就是讓SB動態(tài)渲染出該類圖形化界面;

  • 使用IB_DESIGNABLE的方式永乌,把該宏加在自定義類的前面;
    這兩個配合著使用具伍,就可以在StoryBoard上直接設置一些系統(tǒng)不提供的屬性了翅雏,例如線段的寬度、顏色等等人芽。個性化定制一個屬于自己的SB望几。

Paste_Image.png
  • IBInspectable 就是讓SB上出現屬性的修改框,可以在SB直接修改:
Paste_Image.png

5. C和OC混合繪制圖形小帖士

  • C和OC繪制圖形的時候萤厅,如果混合使用橄抹,以C語言為主。
Paste_Image.png
Paste_Image.png

哈哈惕味,寫完這篇楼誓,下篇就開始自己繪制一個進度條拉。不知道各位是不是已經踏上回家的征程了吶名挥?希望各位雞年大吉~新年新祝福疟羹,說雞不說吧~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子阁猜,更是在濱河造成了極大的恐慌丸逸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剃袍,死亡現場離奇詭異黄刚,居然都是意外死亡,警方通過查閱死者的電腦和手機民效,發(fā)現死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門憔维,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畏邢,你說我怎么就攤上這事业扒。” “怎么了舒萎?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵程储,是天一觀的道長。 經常有香客問我臂寝,道長章鲤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任咆贬,我火速辦了婚禮败徊,結果婚禮上,老公的妹妹穿的比我還像新娘掏缎。我一直安慰自己皱蹦,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布眷蜈。 她就那樣靜靜地躺著沪哺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酌儒。 梳的紋絲不亂的頭發(fā)上凤粗,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音今豆,去河邊找鬼。 笑死柔袁,一個胖子當著我的面吹牛呆躲,可吹牛的內容都是我干的。 我是一名探鬼主播捶索,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼插掂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起辅甥,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酝润,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后璃弄,有當地人在樹林里發(fā)現了一具尸體要销,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年夏块,在試婚紗的時候發(fā)現自己被綠了疏咐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脐供,死狀恐怖浑塞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情政己,我是刑警寧澤酌壕,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站歇由,受9級特大地震影響卵牍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜印蓖,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一辽慕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赦肃,春花似錦溅蛉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厅各,卻和暖如春镜撩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背队塘。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工袁梗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憔古。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓遮怜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸿市。 傳聞我的和親對象是個殘疾皇子锯梁,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容

  • 這一篇就應該是繪圖這個系列的基礎中最后一篇了陌凳,然后剥懒,然后就過年啦!:隙亍3蹰佟!在此之前蛤肌,分享了一些關于繪圖方面的基礎壁却。可...
    非典型技術宅閱讀 5,976評論 12 67
  • 發(fā)現 關注 消息 iOS 第三方庫裸准、插件展东、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 飛來F9手機的性能和特點: 1. 外觀:高大上; 2. 做工精細炒俱; 3. 手感好盐肃; 4. 顏色:土...
    蒲公英_5d8f閱讀 5,509評論 0 0
  • 圖案原型都是網上搜的照片,然后進行了簡化权悟,加入一些禪繞畫元素~
    SugarLYS閱讀 508評論 2 2
  • 基本數據類型:包含int,String,Date等砸王。基本數據類型作為傳參峦阁,只能傳入一個谦铃。通過#{參數名}即可獲取傳...
    納米君閱讀 935評論 0 0