最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS繪制3D餅圖的實(shí)現(xiàn)方法

 更新時(shí)間:2017年01月05日 11:18:38   作者:sunshineWarmYou  
餅圖常用于統(tǒng)計(jì)學(xué)模塊。常見的一般為2D餅圖,這篇文章主要介紹了iOS繪制3D餅圖的實(shí)現(xiàn)方法,3D餅圖更加立體,用戶的好感度也比較高,下面需要的朋友可以參考借鑒,一起來看看吧。

實(shí)現(xiàn)核心

     1.壓縮餅圖,使餅圖有3D的效果,并不是真正的畫了個(gè)3D圓柱

     2.繪制厚度,帶陰影效果,讓看上去像是圓柱的高

     3.路徑添加好了,用顏色填充后繪制一下,添加陰影后還需繪制一遍

餅圖添加陰影的思考

之前這加陰影的一段不是很明白,為啥設(shè)顏色和陰影都要draw一次

進(jìn)過反復(fù)的測試,我自己分析了一下,每次draw一下想當(dāng)于,把當(dāng)前的設(shè)置畫出來,再次draw就在這基礎(chǔ)上,再畫最近的設(shè)置,這里加顏色和陰影就像是一層一層的畫上去。要是不draw的話,再設(shè)置顏色相當(dāng)于重新設(shè)置了顏色,之前設(shè)置的顏色就無效了。同時(shí)要結(jié)合path使用,如果設(shè)置一場顏色draw一次,再設(shè)置顏色draw一次,后面設(shè)置的顏色是無用的。需要添加陰影的部分,需要用path路徑繪制。

效果圖

3D餅圖的核心代碼如下:

#import "SSSolidCakeView.h"

@implementation SSSolidCakeView
#pragma mark 重寫繪制方法
- (void)drawRect:(CGRect)rect
{
  //第一步獲得上下文
  CGContextRef cakeContextRef = UIGraphicsGetCurrentContext();
  //反鋸齒,讓圖形邊緣更加柔和(Sets whether or not to allow anti-aliasing for a graphics context.)
  CGContextSetAllowsAntialiasing(cakeContextRef, TRUE);
  //縮放坐標(biāo)系的比例,通過設(shè)置y軸壓縮,然后畫代陰影的厚度,就畫出了像是3D餅圖的效果
  CGContextScaleCTM(cakeContextRef, _xScale, _yScale);
  //餅圖最先的起始角度
  CGFloat startAngle =0;

  for (int i = 0; i<_dataArray.count; i++) {
    //畫餅的橫截面,上一部分完整的圓
    //cake當(dāng)前的角度
    CGFloat currentAngle = [_dataArray[i] floatValue];
    //結(jié)束的角度
    CGFloat endAngle = startAngle + currentAngle;
    //每一塊cake的起點(diǎn),也就是圓心
    CGContextMoveToPoint(cakeContextRef, _cakeCenter.x, _cakeCenter.y);

    //添加對應(yīng)角度扇形
    CGContextAddArc(cakeContextRef, _cakeCenter.x, _cakeCenter.y, _cakeRadius, startAngle*M_PI*2, endAngle*M_PI*2, 0);

    //得到對應(yīng)的顏色
    UIColor *currentColor = _colorArray[i];
    //設(shè)置邊界顏色
    CGContextSetStrokeColorWithColor(cakeContextRef, currentColor.CGColor);
    //設(shè)置填充顏色
    CGContextSetFillColorWithColor(cakeContextRef, currentColor.CGColor);
    //畫子路徑,這里就繪制還不是在畫完厚度再繪制,是因?yàn)椴⒉恍枰L制所有cake的厚度,但是上一部分的圓是都要繪制的
    CGContextDrawPath(cakeContextRef, kCGPathFill);
    //餅圖上一部分圓,startAngle處的起點(diǎn)坐標(biāo)
    CGFloat upStartX = _cakeCenter.x+_cakeRadius*cos(startAngle*2*M_PI);
    CGFloat upStartY = _cakeCenter.y+_cakeRadius*sin(startAngle*2*M_PI);
    //餅圖上一部分圓,endAngle處的終點(diǎn)坐標(biāo)
    CGFloat upEndX = _cakeCenter.x+_cakeRadius*cos(endAngle*2*M_PI);
    CGFloat upEndY = _cakeCenter.y+_cakeRadius*sin(endAngle*2*M_PI);

    //餅圖厚度在角度結(jié)束處y坐標(biāo)
    CGFloat downEndY = upEndY + _cakeHeight;
    //畫圓柱的側(cè)面,餅圖的厚度,圓柱的前半部分能看到,后半部分是看不到
    //開始的角度如果>=M_PI,就會在圓柱的后面,側(cè)面厚度就沒必要畫了
    if (startAngle<0.5) {
      //繪制厚度
      CGMutablePathRef path = CGPathCreateMutable();
      CGPathMoveToPoint(path, nil, upStartX, upStartY);
      //當(dāng)結(jié)束的角度>0.5*2*M_PI時(shí),結(jié)束的角度該是M_PI的地方(視覺原因)
      if (endAngle>0.5) {
        //上部分的弧
        CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y, _cakeRadius, startAngle*2*M_PI, M_PI, 0);
        //在角度結(jié)束的地方,上部分到下部分的直線
        CGPathAddLineToPoint(path, nil, _cakeCenter.x-_cakeRadius, _cakeCenter.y+_cakeHeight);
        //下部分的弧
        CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y + _cakeHeight, _cakeRadius, M_PI, startAngle*2*M_PI, 1);
        //在角度開始的地方,從下部分到上部分的直線
        CGPathAddLineToPoint(path, nil, upStartX, upStartY);

      }
      else{
        //上部分的弧
        CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y, _cakeRadius, startAngle*2*M_PI, endAngle*2*M_PI, 0);
        //在角度結(jié)束的地方,上部分到下部分的直線
        CGPathAddLineToPoint(path, nil, upEndX, downEndY);
        //下部分的弧
        CGPathAddArc(path, nil, _cakeCenter.x, _cakeCenter.y + _cakeHeight, _cakeRadius, endAngle*2*M_PI, startAngle*2*M_PI, 1);
        //在角度開始的地方,從下部分到上部分的直線
        CGPathAddLineToPoint(path, nil, upStartX, upStartY);

      }
      //之前這一段不是很明白,為啥設(shè)顏色和陰影都要draw一次
      //我自己嘗試并理解分析了一下,每次draw一下想當(dāng)于,把當(dāng)前的設(shè)置畫出來,再次draw就在這基礎(chǔ)上,再畫當(dāng)前的設(shè)置,這里加顏色和陰影就是一層一層的畫上去。要是不draw的話,再設(shè)置顏色相當(dāng)于重新設(shè)置了顏色,之前設(shè)置的顏色就無效了。
      CGContextAddPath(cakeContextRef, path);
      CGContextDrawPath(cakeContextRef, kCGPathFill);
      //加陰影
      [[UIColor colorWithWhite:0.2 alpha:0.4] setFill];
      CGContextAddPath(cakeContextRef, path);
      CGContextDrawPath(cakeContextRef, kCGPathFill);

    }

    //最后一句,上一塊的結(jié)束角度是下一塊的開始角度
    startAngle = endAngle;

  }
  //此時(shí)不能用以下的方法填充,會導(dǎo)致餅圖就一種顏色
  //CGContextFillPath(contextRef);
}
-(void)setDataArray:(NSArray *)dataArray
{
  _dataArray = dataArray;
  //重新繪制
  [self setNeedsDisplay];
}

這里要說明一下,我的數(shù)組是百分比數(shù)組,由數(shù)值轉(zhuǎn)化為百分比的過程我沒有在這里處理。

如何使用view:

  self.solidCakeView = [[SSSolidCakeView alloc]init];
  self.solidCakeView.dataArray = _dataArray;
  self.solidCakeView.colorArray = _colorArray;
  self.solidCakeView.nameArray = _nameArray;
  self.solidCakeView.cakeCenter = CGPointMake(200, 200);
  self.solidCakeView.cakeRadius = 100;
  self.solidCakeView.cakeHeight = 30;
  self.solidCakeView.xScale = 1;
  self.solidCakeView.yScale = 0.8;
  self.solidCakeView.backgroundColor = [UIColor whiteColor];
  self.solidCakeView.frame = CGRectMake(0, 0, PhoneScreen_WIDTH-100, PhoneScreen_HEIGHT-20);
  [self.view addSubview:self.solidCakeView];

3D餅圖如何繪制及使用已經(jīng)用代碼介紹完了,相信看到這大家應(yīng)該也能實(shí)現(xiàn)3D餅圖了。

本文參考了:http://blog.csdn.net/donny_zhang/article/details/9145379  感謝博主!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位iOS開發(fā)者們能有一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • iOS?Swift?Lazy?var?View失效問題解決

    iOS?Swift?Lazy?var?View失效問題解決

    這篇文章主要為大家介紹了iOS?Swift?Lazy?var?View失效問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • iOS統(tǒng)計(jì)工程里所有大于2000行代碼的文件方法

    iOS統(tǒng)計(jì)工程里所有大于2000行代碼的文件方法

    下面小編就為大家分享一篇iOS統(tǒng)計(jì)工程里所有大于2000行代碼的文件方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • IOS點(diǎn)擊按鈕隱藏狀態(tài)欄詳解及實(shí)例代碼

    IOS點(diǎn)擊按鈕隱藏狀態(tài)欄詳解及實(shí)例代碼

    這篇文章主要介紹了IOS點(diǎn)擊按鈕隱藏狀態(tài)欄詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Objective-C中利用正則去除非數(shù)字字母漢字方法實(shí)例

    Objective-C中利用正則去除非數(shù)字字母漢字方法實(shí)例

    正則表達(dá)式對我們?nèi)粘i_發(fā)來說是必不可少的,下面這篇文章主要給大家介紹了關(guān)于Objective-C中如何利用正則去除非數(shù)字字母漢字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • 詳解iOS webview加載時(shí)序和緩存問題總結(jié)

    詳解iOS webview加載時(shí)序和緩存問題總結(jié)

    本篇文章主要介紹了iOS webview加載時(shí)序和緩存問題總結(jié) ,這兩天學(xué)習(xí)了Vue.js 感覺組件這個(gè)地方知識點(diǎn)挺多的,而且很重要,所以,今天添加一點(diǎn)小筆記。
    2017-09-09
  • iOS應(yīng)用設(shè)計(jì)模式開發(fā)中對簡單工廠和工廠方法模式的運(yùn)用

    iOS應(yīng)用設(shè)計(jì)模式開發(fā)中對簡單工廠和工廠方法模式的運(yùn)用

    這篇文章主要介紹了iOS應(yīng)用設(shè)計(jì)模式開發(fā)中對簡單工廠和工廠方法模式的運(yùn)用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-03-03
  • iOS開發(fā)中Swift3 監(jiān)聽UITextView文字改變的方法(三種方法)

    iOS開發(fā)中Swift3 監(jiān)聽UITextView文字改變的方法(三種方法)

    在項(xiàng)目中使用文本輸入框出UITextField之外還會經(jīng)常使用 UITextView ,難免會有需求監(jiān)聽UITextView文本框內(nèi)文本數(shù)量.下面介紹在swift3中兩種常用方式,需要的朋友參考下吧
    2016-11-11
  • ios開發(fā)中的容錯處理示例詳解

    ios開發(fā)中的容錯處理示例詳解

    最近發(fā)現(xiàn)還是有很多朋友在問類似解析時(shí)容錯問題怎么解決,所以下面這篇文章主要給大家介紹了關(guān)于ios開發(fā)中的容錯處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來看看吧
    2018-05-05
  • iOS 12適配以及問題小記

    iOS 12適配以及問題小記

    蘋果官方在上個(gè)月推送了iOS12系統(tǒng),作為一名開發(fā)者當(dāng)然要緊跟更新技術(shù),所以下面這篇文章主要給大家介紹了關(guān)于iOS 12適配以及一些問題,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法

    iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法

    這篇文章主要介紹了iOS中獲取當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法,這里的火星坐標(biāo)指的是我國專門研制的一種加密的坐標(biāo)系統(tǒng)...需要的朋友可以參考下
    2016-02-02

最新評論

陕西省| 江华| 唐河县| 丹凤县| 新源县| 开阳县| 兰州市| 沙河市| 青阳县| 柳江县| 额济纳旗| 青州市| 华蓥市| 乌审旗| 肇庆市| 元谋县| 阜南县| 卢氏县| 庆城县| 五指山市| 高州市| 新乐市| 兰西县| 美姑县| 珠海市| 达孜县| 上犹县| 辽源市| 湖口县| 大安市| 通州市| 怀仁县| 景德镇市| 邯郸县| 潞西市| 涟水县| 黑水县| 离岛区| 徐闻县| 鄄城县| 财经|