登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

绘制扇形图

[复制链接]
来自: RYC 分类: iOS精品源码 上传时间: 2016-5-31 18:25:21
Tag:图表 charts 扇形图 圆弧 统计

项目介绍:

绘制扇形图,可见到各个属性的占比情况。

主要实现代码:
[Objective-C] 查看源文件 复制代码
#import "YCCircleView.h"

#define kCircleViewW self.bounds.size.width     // 视图本身宽度
#define kCircleViewH self.bounds.size.height    // 视图本身高度
#define kOneRadian M_PI / 180                   // 一弧度/ 180
#define kCircleX kCircleViewW * 0.5             // 圆弧中点X坐标
#define kCircleY kCircleViewH * 0.5             // 圆弧中点Y坐标
#define k360Radian 360 * kOneRadian             // 360弧度
#define kAngle(angle) ((angle) / 180 * M_PI)    // 暂时没用

#define kRanderColor [UIColor colorWithRed:arc4random() % 255/ 256.0 green:arc4random() % 255/ 256.0 blue:arc4random() % 255/ 256.0 alpha:1.0]

@interface YCCircleView ()
/**
 *   半径数据源
 */
@property (nonatomic, strong) NSArray *radiusSource;



@end

 @implementation YCCircleView

- (instancetype)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {
        
        self.backgroundColor = [UIColor whiteColor];
        // 圆弧半径:根据视图的高度进行比例设置
        self.radiusSource = @[@0.5,@0.4,@0.35,@0.3,@0.25,@0.2];
    }
    
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    //
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 画圆弧
    CGFloat startPoint = - kOneRadian * 90; // 开始角度
    CGFloat endPoint = 0;                   // 结束角度
     CGFloat angle = 100;                   // 画标签角度:初始值为90 也就是最上方的位置
    for (int i = 0; i < self.dataSource.count; i ++) {
        // 设置颜色
        [self.colorSource[i] setFill];
        
        if (i == 0) {
            endPoint = - kOneRadian * 90 - ([self.dataSource[0] floatValue] * k360Radian);
        }
        // 画圆弧
        CGContextAddArc(ctx, kCircleX, kCircleY, kCircleViewH * [self.radiusSource[i] floatValue] , startPoint, endPoint, 1);
        // 画直线,关闭圆弧
        CGContextAddLineToPoint(ctx, kCircleX, kCircleY);
        
        // 显示所绘制的图形
        CGContextFillPath(ctx);
  
    
        // 绘画标签
        {

            // 标签的中心点
            CGPoint center;
//            NSLog(@"------%f",angle);
            // 角度
            CGFloat angleRadius = [self.radiusSource[i] floatValue];
            if (i == self.dataSource.count - 1) {
                angleRadius += 0.2;
            }
            //计算弧度在坐标系上的点
            center = [self calcCircleCoordinateWithCenter:CGPointMake(kCircleX, kCircleY) andWithAngle: angle   andWithRadius:kCircleViewH *angleRadius + 12] ;
        
            [self.colorSource[i] setStroke];
            CGContextMoveToPoint(ctx, kCircleX, kCircleY);
            CGContextAddLineToPoint(ctx, center.x, center.y);
            CGContextStrokePath(ctx);
            
            // 标签控件
            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 15)];
            label.center = center;
            label.backgroundColor = [UIColor clearColor];
            label.text = [NSString stringWithFormat:@"%@ %.0f%%",self.titleSource[i],[self.dataSource[i] floatValue] * 100];
            label.font = [UIFont systemFontOfSize:12];
            label.textAlignment = NSTextAlignmentCenter;
            [self addSubview:label];
            // 显示所绘制的东西
            CGContextFillPath(ctx);
            
            // 更改弧度值
            angle  += [self.dataSource[i] floatValue] * 360 ;

        }
    
        // 更新开始角度和结束角度
        startPoint = endPoint;
        if (i == self.dataSource.count - 1) {
            continue;
        }else {
            endPoint = endPoint - ([self.dataSource[i + 1] floatValue] * k360Radian);
        }
        
      }
    
    
    // 画最后圆
    CGContextAddArc(ctx,kCircleX, kCircleX, kCircleViewH * 0.1, 0, - k360Radian, 1);
    
    CGContextAddLineToPoint(ctx, kCircleX, kCircleY);
    [[UIColor whiteColor] set];
    // 显示所绘制的东西
    CGContextFillPath(ctx);
    
    
}

/**
 *  根据圆弧上的弧度值返回在坐标系上的点
 *
 *  @param center 弧度的中心
 *  @param angle  弧度的角度
 *  @param radius 弧度的半径
 *
 */
- (CGPoint) calcCircleCoordinateWithCenter:(CGPoint) center  andWithAngle : (CGFloat) angle andWithRadius: (CGFloat) radius{
    CGFloat x2 = radius*cosf(angle*M_PI/180);
    CGFloat y2 = radius*sinf(angle*M_PI/180);
//    NSLog(@" --centern %@",NSStringFromCGPoint(center));
//    NSLog(@"x2 --- %f , y2 --- %f",x2,y2);
    return CGPointMake(center.x+x2, center.y-y2);
}

@end


旧版本: YCCircle.zip (34.68 KB, 下载次数: 568)
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )