Сглаживание основных графических кривых - PullRequest
6 голосов
/ 11 января 2012

Я пытаюсь создать круглую полосу загрузки и хочу использовать Core Graphics вместо маскировки изображений для создания эффекта. Однако я не получаю верность, на которую я надеялся: enter image description here

Независимо от того, что я пробовал, неровности кажутся довольно плохими. Сглаживание включено, и я уже пытался уменьшить "плоскостность" до .1 на CGContextRef. Изображение с симулятора (Retina), оно выглядит на устройстве немного лучше, но все же не так здорово.

Код чертежа в подклассе CALayer:

-(void)drawInContext:(CGContextRef)ctx {    
    CGPoint center = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2);

    CGFloat delta = toRadians(360 * percent);

    CGFloat innerRadius = 69.5;
    CGFloat outerRadius = innerRadius + 12;

    CGContextSetFillColorWithColor(ctx, [UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:.5].CGColor);
    CGContextSetStrokeColorWithColor(ctx, [UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:10.0].CGColor);
    CGContextSetLineWidth(ctx, 1);

    CGMutablePathRef path = CGPathCreateMutable();

    CGPathAddRelativeArc(path, NULL, center.x, center.y, innerRadius, -(M_PI / 2), delta);
    CGPathAddRelativeArc(path, NULL, center.x, center.y, outerRadius, delta - (M_PI / 2), -delta);
    CGPathAddLineToPoint(path, NULL, center.x, center.y-innerRadius);

    CGContextAddPath(ctx, path);
    CGContextFillPath(ctx);
    CGContextAddPath(ctx, path);
    CGContextStrokePath(ctx);
}

Это лучшее, что может сделать Core Graphics, или я что-то упустил?

1 Ответ

11 голосов
/ 12 января 2012

Обнаружил мою конкретную проблему.Поскольку я создавал CALayer (для добавления в качестве подслоя), contentScale не автоматически устанавливался на дисплей Retina.Это решает это:

percentLayer.contentsScale = [UIScreen mainScreen].scale;

Спасибо, Роб, за то, что подтолкнул меня в правильном направлении.

...