Сглаженный рисунок в CALayer - PullRequest
5 голосов
/ 20 мая 2011

Привет!Я пытаюсь нарисовать серию кругов в CALayer, который находится в масштабируемом UISCrollView.Это слой, который увеличивает масштаб.Если я рисую круги с помощью CAShapeLayer, то они прекрасно масштабируются:

CAShapeLayer plotLayer = [CAShapeLayer layer];
plotLayer.bounds = self.bounds;
plotLayer.anchorPoint = CGPointZero;
plotLayer.position = CGPointZero;

CGMutablePathRef path = CGPathCreateMutable();
for (id one in many) {
    CGRect ellipseRect = [one circleRect];
    CGPathAddEllipseInRect(path, NULL, ellipseRect);
}
plotLayer.path = path
CFRelease(path);
[self.layer addSublayer:plotLayer];
[plotLayer setNeedsDisplay];

Однако, когда я пытаюсь нарисовать их с использованием графики с ванильным ядром в моем методе drawLayer: inContext:, круги становятся очень неровными (прямо про-alassed!) Никакое количество jialgery-pokery от antialias, похоже, не поможет:

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    CGContextSetAllowsAntialiasing(context, true);
    CGContextSetShouldAntialias(context, true);
    CGContextClip(context);

    for (id one in many) {
        CGRect ellipseRect = [one circleRect];
        CGContextStrokeEllipseInRect(context, ellipseRect);
    }
}

Я пытаюсь выяснить, что делает CAShapeLayer, чтобы получить такой хороший сглаживатель, чтобы (кроме моего собственного назидания) яможет использовать все преимущества основной графики в моем чертеже, а не только штрих / заливку, которые я могу получить с помощью CAShapeLayer.Я просто где-то пропустил преобразование?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Краткий ответ: contentsScale

Более длинный ответ: (взят почти дословно из pe8ter в Вектор, как рисунок для масштабируемого UIScrollView ):

Вы можете получить лучший рендеринг с помощьюустановка свойства contentScale в рассматриваемом слое после масштабирования:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView
                       withView:(UIView *)view
                        atScale:(float)scale
{
    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithBool:YES] 
                     forKey:kCATransactionDisableActions];
    uglyBlurryTextLayer.contentsScale = scale;
    [CATransaction commit];
}

Брэд Ларсон (как правило, отлично) описывает, когда происходит реальное рисование (спойлер, обычно это происходит только один раз, несмотря на количество преобразований.применяется) на То есть CALayer не содержит растровое изображение содержимого представления? .Исходя из этого, я могу только предположить, что установка contentScale заставляет слой снова визуализироваться.

0 голосов
/ 26 мая 2011

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

Вы пытались установить высокое качество интерполяции?

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...