Рисование круга, заполненного разными частями разным цветом

Я начинающий программист ios. В одном из моих проектов мне нужно нарисовать круг, в котором разные части круга будут заполнены разными цветами. Я могу нарисовать круг. Но я не могу определить другую часть круга и залейте их другим цветом. Вот скриншот, чтобы уточнить, что я хочу нарисовать.

Помощь будет оценена.

 Amar24 июн. 2013 г., 09:03
Выглядит как круговая диаграмма. Почему бы не использоватьОсновной сюжет за это?
 Nitin Gohel24 июн. 2013 г., 09:07
Основной сюжет является лучшей платформой для создания диаграмм в приложении ios. Но взгляните ниже Github удивительный пример кода: -github.com/xyfeng/XYPieChart!введите описание изображения здесь
 sujat24 июн. 2013 г., 10:41
@Rob на самом деле я использую основные графические функции, такие как CGContext.
 Carien van Zyl22 сент. 2016 г., 07:37
Я также могу порекомендовать IOS Chartsgithub.com/danielgindi/Charts
 Rob24 июн. 2013 г., 09:05
Чтобы люди могли дать вам ответы, подходящие для вашей реализации, вы можете сообщить нам, если выиспользовать функции CoreGraphics (те функции, которые начинаются сCGContext) в своем собственномdrawRectили используяUIBezierPath stroke метод или использование.CAShapeLayer

Ответы на вопрос(3)

Простой вопрос тригонометрии. Выясните угол, который вам нужен для части пирога (процентное соотношение среза пирога 360 градусов), затем вы двигаетесь к центру. Линия до края круга под соответствующим углом, дуга на следующую сторону кругового среза для нужного вам угла дуги, затем линия назад к центру.

В качестве альтернативы, вы можете использоватьCorePlot сделать круговые диаграммы для вас.

у нас 6 класс

CircleViewController.h, CircleViewController.m, GraphView.h, GraphView.h, CirclePart.h, CirclePart.m

CirclePart.h

#import <foundation foundation.h="">
#import <uikit uikit.h="">

@interface CirclePart : NSObject

@property (nonatomic) CGFloat startDegree;
@property (nonatomic) CGFloat endDegree;
@property (nonatomic) UIColor *partColor;

-(id)initWithStartDegree:(CGFloat)startDegree endDegree:(CGFloat)endDegree partColor:(UIColor*)partColor;

@end
</uikit></foundation>

CirclePart.m

#import "CirclePart.h"

@implementation CirclePart

-(id)initWithStartDegree:(CGFloat)startDegree endDegree:(CGFloat)endDegree partColor:(UIColor*)partColor
{
    self = [super init];
    if (self) {
        self.startDegree = startDegree;
        self.endDegree = endDegree;
        self.partColor = partColor;
    }
    return self;
}

@end

GraphView.h

#import <uikit uikit.h="">
#import "CirclePart.h"

@interface GraphView : UIView

@property (nonatomic) CGPoint centrePoint;
@property (nonatomic) CGFloat radius;
@property (nonatomic) CGFloat lineWidth;
@property (nonatomic, strong) NSArray *circleParts;

-(id)initWithFrame:(CGRect)frame CentrePoint:(CGPoint)centrePoint radius:(CGFloat)radius lineWidth:(CGFloat)lineWidth circleParts:(NSArray*)circleParts;

@end
</uikit>

GraphView.m

#import "GraphView.h"

@implementation GraphView

-(id)initWithFrame:(CGRect)frame CentrePoint:(CGPoint)centrePoint radius:(CGFloat)radius lineWidth:(CGFloat)lineWidth circleParts:(NSArray*)circleParts
{
    self = [super initWithFrame:frame];
    if (self) {
        self.centrePoint = centrePoint;
        self.radius = radius;
        self.lineWidth = lineWidth;
        self.circleParts = circleParts;
    }
    return self;
}

- (void)drawRect:(CGRect)rect {

    [self drawCircle];
}

- (void)drawCircle {

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, _lineWidth);

    for(CirclePart *circlePart in _circleParts)
    {
        CGContextMoveToPoint(context, _centrePoint.x, _centrePoint.y);

        CGContextAddArc(context, _centrePoint.x , _centrePoint.y, _radius, [self radians:circlePart.startDegree], [self radians:circlePart.endDegree], 0);
        CGContextSetFillColorWithColor(context, circlePart.partColor.CGColor);
        CGContextFillPath(context);
    }
}

-(float) radians:(double) degrees {
    return degrees * M_PI / 180;
}


@end

CircleViewController.h

#import <uikit uikit.h="">

@interface CircleViewController : UIViewController

@end
</uikit>

CircleViewController.m

#import "CircleViewController.h"
#import "GraphView.h"
#import "CirclePart.h"

@interface CircleViewController ()

@end

@implementation CircleViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    CirclePart *part1 = [[CirclePart alloc] initWithStartDegree:0 endDegree:120 partColor:[UIColor redColor]];
    CirclePart *part2 = [[CirclePart alloc] initWithStartDegree:120 endDegree:250 partColor:[UIColor blueColor]];
    CirclePart *part3 = [[CirclePart alloc] initWithStartDegree:250 endDegree:360 partColor:[UIColor grayColor]];

    NSArray *circleParts = [[NSArray alloc] initWithObjects:part1, part2, part3, nil];

    CGRect rect = CGRectMake(100, 100, 200, 200);
    CGPoint circleCenter = CGPointMake(rect.size.width / 2, rect.size.height / 2);

    GraphView *graphView = [[GraphView alloc] initWithFrame:rect CentrePoint:circleCenter radius:80 lineWidth:2 circleParts:circleParts];
    graphView.backgroundColor = [UIColor whiteColor];
    graphView.layer.borderColor = [UIColor redColor].CGColor;
    graphView.layer.borderWidth = 1.0f;

    [self.view addSubview:graphView];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
Решение Вопроса

Ты можешь использоватьUIBezierPath у которого есть методaddArcWithCenter:radius:startAngle:endAngle:clockwise: где вы можете указать радиус, центр и углы. Код может выглядеть так, что рисует четверть круга зеленого цвета:

CGPoint center = CGPointMake(CGRectGetWidth(self.bounds) / 2.f, CGRectGetHeight(self.bounds) / 2.f);
CGFloat radius = center.x - 10.f;

UIBezierPath *portionPath = [UIBezierPath bezierPath];
[portionPath moveToPoint:center];
[portionPath addArcWithCenter:center radius:radius startAngle:0.f endAngle:M_PI_2 clockwise:YES];
[portionPath closePath];

[[UIColor greenColor] setFill];
[portionPath fill];

UIBezierPath *portionPath1 = [UIBezierPath bezierPath];
[portionPath1 moveToPoint:center];
[portionPath1 addArcWithCenter:center radius:radius startAngle:M_PI_2 endAngle:M_PI clockwise:YES];
[portionPath1 closePath];

[[UIColor blueColor] setFill];
[portionPath1 fill];

Конечно, вы также можете использовать библиотеку, какCorePlot.

 sujat24 июн. 2013 г., 11:25
Я тоже так думал. Но что-то не так с моим углом. Не могли бы вы просто показать мне еще один угол вычисления порций. Я попытался сделать это следующим образом [startAngle: M_PI_2 endAngle: M_PI]
 sujat24 июн. 2013 г., 12:22
Это было абсолютно полезно. Большое спасибо @Karl
 Karl24 июн. 2013 г., 11:11
Просто играйте с углами и цветами. Центр и радиус всегда должны быть одинаковыми. Вам нужно будет рассчитать угол каждой части, а затем перебрать все части, увеличивая начальные и конечные углы.
 sujat24 июн. 2013 г., 11:04
он отлично работает для одной порции. но как я могу продолжить его с другими порциями? Я проделал тот же процесс для других порций, меняя начальный угол и & конечный угол .но не работает желательно
 Gabox13 июн. 2016 г., 16:19
хороший ответ спасибо!
 Karl24 июн. 2013 г., 11:36
Я только добавил вторую порцию.

Ваш ответ на вопрос