iOS - UIBezierPath 实现饼状图

首先看效果图:

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CircleView : UIView

@property (nonatomic, copy) NSArray<NSNumber *> *valueArray;

@end

NS_ASSUME_NONNULL_END


//


#define S_W self.frame.size.width

#import "CircleView.h"

@interface CircleView ()

@property (nonatomic, copy) NSArray<NSNumber *> *dataArray;
@property (nonatomic, assign) CGFloat endAngleFloat; // 每个扇形起点角度

@end

@implementation CircleView

- (void)setValueArray:(NSArray<NSNumber *> *)valueArray {
    self.dataArray = valueArray;
    self.endAngleFloat = 0;
    [self creatUI];
}

- (void)creatUI {
    for (NSInteger i = 0; i<_dataArray.count; i++) {
        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
        shapeLayer.lineWidth = 1;
        shapeLayer.fillColor = [UIColor colorWithRed:arc4random()%256/255.0f green:arc4random()%256/255.0f blue:arc4random()%256/255.0f alpha:1].CGColor;
        shapeLayer.strokeColor = shapeLayer.fillColor;
        
        CGFloat valueFloat = [_dataArray[i] floatValue];
        CGFloat angleFloat = valueFloat*2*M_PI/100;
        
        UIBezierPath *bezierPath = [UIBezierPath bezierPath];
        [bezierPath moveToPoint:CGPointMake(S_W/2, S_W/2)];
        [bezierPath addLineToPoint:CGPointMake(S_W*(1+cos(_endAngleFloat))/2, S_W*(1+sin(_endAngleFloat))/2)];
        [bezierPath addArcWithCenter:CGPointMake(S_W/2, S_W/2) radius:S_W/2 startAngle:_endAngleFloat endAngle:angleFloat+_endAngleFloat clockwise:YES];
        [bezierPath closePath];
        shapeLayer.path = bezierPath.CGPath;
        [self.layer addSublayer:shapeLayer];
        
        [self addLabelWithFloat:valueFloat angleFloat:angleFloat];

        _endAngleFloat += angleFloat;
    }
}

- (void)addLabelWithFloat:(CGFloat)valueFloat angleFloat:(CGFloat)angleFloat {
    UILabel *label = [[UILabel alloc] init];
    label.center = CGPointMake(S_W*(2+cos(angleFloat/2 + _endAngleFloat))/4, S_W*(2+sin(angleFloat/2 + _endAngleFloat))/4);
    label.bounds = CGRectMake(0, 0, 50, 50);
    label.text = [NSString stringWithFormat:@"%.f%%",valueFloat];
    label.textColor = UIColor.whiteColor;
    label.textAlignment = NSTextAlignmentCenter;
    label.font = [UIFont systemFontOfSize:14];
    [self addSubview:label];
}

外部调用:

 CircleView *view = [[CircleView alloc] initWithFrame:CGRectMake(20, 100, self.view.frame.size.width-40, self.view.frame.size.width-40)];
    view.valueArray = @[@(10),@(20),@(30),@(40)];
    [self.view addSubview:view];

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值