ZFChart之雷达图改进版

2019-06-13  本文已影响0人  心情的蛊惑

最近有个需求要求做雷达图,在github上搜索第三方,发现ZFChart还不错,但达不到公司的需求,于是动手研究修改了下第三方。效果如下:

原始版:


屏幕快照 2019-06-13 上午10.53.13.png

改进版:


WechatIMG1.jpeg
在ZFRadarChart.m声明
@property (nonatomic, strong) NSMutableArray * describeArray;
@property(nonatomic, strong) ZFPolygon *polygon;

- (void)setDescribeOnChart{
    for (NSInteger i = 0; i < self.describeArray.count; i++) {
        
        CGPoint labelCenter = [self.polygon.describePointArray[i] CGPointValue];
        //        labelCenter.b
        //效果微调
        //
        //        if (i == 0) labelCenter.y -= 10;
        //        if (i == 1) labelCenter.y -= 10;
        //        if (i == 2) labelCenter.y += 5;
        //        if (i == 3) labelCenter.y += 5;
        //        if (i == 4) labelCenter.y -= 10;
        
        
        
        
        
        ZFLabel * itemLabel = [[ZFLabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
        itemLabel.center = CGPointMake(labelCenter.x, labelCenter.y);
        itemLabel.font = [UIFont systemFontOfSize:12.f];
//        itemLabel.text = self.describeArray[i];
//        itemLabel.textColor = [UIColor colorWithRed:73/255.0 green:73/255.0  blue:73/255.0  alpha:1];
//        itemLabel.transform = CGAffineTransformMakeRotation(-_finalRotationAngle);
        itemLabel.backgroundColor = _colorPointArray[i];
        itemLabel.layer.masksToBounds = YES;
        itemLabel.layer.cornerRadius = itemLabel.height/2;
        [self.polygon addSubview:itemLabel];
        
    }
}

注意,在这里我其实放的是label,让它们圆角化了。

在ZFPolygon.m中,声明数组describePointArray

- (UIBezierPath *)fill{
[self.describePointArray removeAllObjects];
    _startAngle = -90.f;
    //获取第一个item半径
    _currentRadius = [_radiusArray.firstObject floatValue];
    UIBezierPath * bezier = [UIBezierPath bezierPath];
    [bezier moveToPoint:CGPointMake(_polygonCenter.x, _polygonCenter.y - _currentRadius)];
      [self.describePointArray addObject:[NSValue valueWithCGPoint:CGPointMake(_polygonCenter.x, _polygonCenter.y - _currentRadius)]];
    for (NSInteger i = 1; i < _radiusArray.count; i++) {
        _currentRadarAngle = _averageRadarAngle * i;
        //计算每个item的角度
        _endAngle = _startAngle + _averageRadarAngle;
        //获取当前item半径
        _currentRadius = [_radiusArray[i] floatValue];
        
        if (_endAngle > -90.f && _endAngle <= 0.f) {
            _endXPos = _polygonCenter.x + fabs(-(_currentRadius * ZFSin(_currentRadarAngle)));
            _endYPos = _polygonCenter.y - fabs(_currentRadius * ZFCos(_currentRadarAngle));
            
        }else if (_endAngle > 0.f && _endAngle <= 90.f){
            _endXPos = _polygonCenter.x + fabs(-(_currentRadius * ZFSin(_currentRadarAngle)));
            _endYPos = _polygonCenter.y + fabs(_currentRadius * ZFCos(_currentRadarAngle));
            
        }else if (_endAngle > 90.f && _endAngle <= 180.f){
            _endXPos = _polygonCenter.x - fabs(-(_currentRadius * ZFSin(_currentRadarAngle)));
            _endYPos = _polygonCenter.y + fabs(_currentRadius * ZFCos(_currentRadarAngle));
            
        }else if (_endAngle > 180.f && _endAngle < 270.f){
            _endXPos = _polygonCenter.x - fabs(-(_currentRadius * ZFSin(_currentRadarAngle)));
            _endYPos = _polygonCenter.y - fabs(_currentRadius * ZFCos(_currentRadarAngle));
        }

        [bezier addLineToPoint:CGPointMake(_endXPos, _endYPos)];
        //记录下一个item开始角度
        _startAngle = _endAngle;
          [self.describePointArray addObject:[NSValue valueWithCGPoint:CGPointMake(_endXPos, _endYPos)]];
    }
    [bezier closePath];
    return bezier;
}

不喜勿喷

上一篇下一篇

猜你喜欢

热点阅读