美文网首页
UIView 扇形

UIView 扇形

作者: xgou | 来源:发表于2016-08-15 17:23 被阅读168次
    - (void)drawRect:(CGRect)rect {
        [super drawRect:rect];
        
        if(self.rateArray.count == 0) {
            return;
        }
        
        double(^angleConverRadian)(double) = ^(double angle) {
            return M_PI / 180 * angle;
        };
        
        CGContextRef contextRef = UIGraphicsGetCurrentContext();
        CGContextBeginPath(contextRef);
        
        __block CGFloat startRadian = -M_PI / 2;
        __block CGFloat startAngle = 0;
        CGFloat w = CGRectGetWidth(self.frame),
        h = CGRectGetHeight(self.frame),
        radius = MIN(w, h) / 2;
        
        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
        [shapeLayer setBounds:self.bounds];
        [shapeLayer setPosition:CGPointMake(w/2, h/2)];
        [shapeLayer setStrokeColor:self.backgroundColor.CGColor];
        [shapeLayer setLineWidth:3.0f];
        [shapeLayer setLineJoin:kCALineJoinRound];
        
        CGMutablePathRef path = CGPathCreateMutable();
        [self.rateArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            CGContextSetLineJoin(contextRef, kCGLineJoinRound);
            CGContextMoveToPoint(contextRef, w / 2, h / 2);
            //这个obj要约定2个元素,一个是角度,和颜色。
            double angle = [obj[@"angle"] floatValue];
            double radian = angleConverRadian([obj[@"angle"] floatValue]);
            
            CGContextAddArc(contextRef, w / 2, h / 2, radius, startRadian, startRadian + radian, NO);
            
            CGContextSetFillColorWithColor(contextRef, [obj[@"color"] CGColor]);
            
            CGContextDrawPath(contextRef, kCGPathFill);
            CGPoint beginPoint = CGPointZero;
            
            if(startAngle <= 90) {
                beginPoint = CGPointMake(sin(angleConverRadian(startAngle)) * radius + radius, radius - cos(angleConverRadian(startAngle)) * radius);
            
            }
            
            else if (startAngle <= 180) {
            
                beginPoint = CGPointMake(sin(angleConverRadian(180 - startAngle)) * radius + radius, cos(angleConverRadian(180 - startAngle)) * radius + radius);
            
            }
            
            else if (startAngle <= 270) {
            
                beginPoint = CGPointMake(radius - sin(angleConverRadian(270 - startAngle)) * radius, cos(angleConverRadian(270 - startAngle)) * radius + radius);
            
            }
            
            else if (startAngle <= 360) {
            
                beginPoint = CGPointMake(radius - sin(angleConverRadian(360 - startAngle)) * radius, cos(360 - startAngle) * radius);
            
            }
            
            CGPathMoveToPoint(path, NULL, beginPoint.x, beginPoint.y);
            
            CGPathAddLineToPoint(path, NULL, w / 2, h / 2);
            
            startRadian += radian;
            
            startAngle += angle;
        
        }];
        
        shapeLayer.path = path;
        
        CGPathRelease(path);
        
        [[self layer] addSublayer:shapeLayer];
    
    }
    

    相关文章

      网友评论

          本文标题:UIView 扇形

          本文链接:https://www.haomeiwen.com/subject/vbbusttx.html