CGContextSetRGBStrokeColor не будет рисовать границы - PullRequest
0 голосов
/ 30 сентября 2011

Я пытаюсь создать круговую диаграмму. Каждый пирог должен быть разного цвета и иметь границы. Итак, я сделал свой собственный класс PieChart.m:

#import "PieChart.h"


@implementation PieChart
@synthesize startDeg, endDeg, isSelected, colorNumber;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code

    int centerX = 120;
    int centerY = 160;
    int radius  = 94;

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(ctx, 255.0/255.0, 255.0/255.0, 255.0/255.0, 1.0);
    CGContextSetLineWidth(ctx, 2.0);

    CGContextSetRGBFillColor(ctx, [self getColorFor:1]/255.0, [self getColorFor:2]/255.0, [self getColorFor:3]/255.0, 1.0);

    CGContextMoveToPoint(ctx, centerX, centerY);
    CGContextAddArc(ctx, centerX, centerY, radius, (startDeg)*M_PI/180.0, (endDeg)*M_PI/180.0, 0); 

    CGContextClosePath(ctx);
    CGContextFillPath(ctx);
}

- (void)dealloc
{
    [super dealloc];
}

-(float)getColorFor:(int)rgb {
    if (colorNumber == 1) {
        switch (rgb) {
            case 1:
                return 232.0;
                break;
            case 2:
                return 96.0;
                break;
            case 3:
                return 104.0;
                break;

            default:
                return 255.0;
                break;
        }
    }
    if (colorNumber == 2) {
        switch (rgb) {
            case 1:
                return 248.0;
                break;
            case 2:
                return 198.0;
                break;
            case 3:
                return 6.0;
                break;

            default:
                return 255.0;
                break;
        }
    }

    return 255.0;
}

@end

Проблема в том, что границы никогда не будут рисоваться. Или, если мне удастся нарисовать границу, заливки там не будет! Любые предложения, как это должно быть достигнуто?

Вот как я использую класс в моем viewcontroller:

- (void)viewDidLoad
{
    [super viewDidLoad];

    PieChart *pie1 = [[PieChart alloc] initWithFrame:CGRectMake(10, 10, 300, 400)];
    pie1.startDeg = 0;
    pie1.endDeg = 127;
    pie1.colorNumber = 1;
    pie1.backgroundColor = [UIColor clearColor];

    PieChart *pie2 = [[PieChart alloc] initWithFrame:CGRectMake(10, 10, 300, 400)];
    pie2.startDeg = 127;
    pie2.endDeg = 360;
    pie2.colorNumber = 2;
    pie2.backgroundColor = [UIColor clearColor];

    [self.view addSubview:pie1];
    [self.view addSubview:pie2];
}

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Проблема с вашим кодом в том, что вы только заполняете свой путь, а не гладите его - так что теперь граница естественным образом нарисована. Вам нужно заменить вызов CGContextFillPath на

CGContextDrawPath (ctx, kCGPathFillStroke);
0 голосов
/ 30 сентября 2011

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

Это можно исправить, повторно добавив свой путь перед штрихом, или используя CGContextDrawPath

...