CGLayer и сглаженные CGPaths - PullRequest
       21

CGLayer и сглаженные CGPaths

4 голосов
/ 06 августа 2011

Я рисую несколько CGPaths в представлении Какао в методе drawRect на iPad.Я начал рисовать их прямо в контексте UIGraphicsGetCurrentContext(), но производительность пошла на юг, когда мои пути стали очень длинными.Основываясь на нескольких других вопросах, я начал изучать использование CGLayer s.

Так что я сейчас делаю, чтобы отобразить путь внутри CGContextRef, который я получаю от вызова CGLayerGetContext.Вот основной набросок того, что я делаю:

// rect comes from the drawRect: method
layer = CGLayerCreateWithContext(context, rect.size, NULL);
layerContext = CGLayerGetContext(layer);
CGContextSetLineCap(layerContext, kCGLineCapRound);

// Set the line styles
CGContextSetLineJoin(layerContext, kCGLineJoinRound);
CGContextSetLineWidth(layerContext, 1.0);
CGContextSetStrokeColorWithColor(layerContext, [UIColor blackColor].CGColor);

// Create a mutable path
path = CGPathCreateMutable();

// Move to start point
//...

for (int i = 0; i < points.count; i++) {
    // compute controlPoint and anchorPoint
    //...

    CGPathAddQuadCurveToPoint(path,
                              nil,
                              controlPoint.x,
                              controlPoint.y,
                              anchorPoint.x,
                              anchorPoint.y);
}
// Stroke the path
CGContextAddPath(layerContext, path);
CGContextStrokePath(layerContext);

// Add the layer to the main context
CGContextDrawLayerAtPoint(context, CGPointZero, layer);

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

CGContextSetShouldAntialias(layerContext, YES);
CGContextSetAllowsAntialiasing(layerContext, YES);
CGContextSetInterpolationQuality(layerContext, kCGInterpolationHigh);

к коду выше, но безрезультатно.Я даже установил свойства сглаживания на основной context без изменений.Я сделал снимки экрана с теми же результатами кода, но со вторым изображением, являющимся изображением, созданным из рисунка в CGLayer.Как вы можете видеть, он действительно зазубренный, несмотря на то, что код тот же, просто рисует в layerContext.Как сделать так, чтобы линии в CGLayer были плавными?

smooth lines jagged lines

1 Ответ

2 голосов
/ 17 августа 2011

Я нашел причину, по которой второе изображение не является сглаженным, потому что не было ничего, что могло бы быть использовано для сглаживания.Фон был пустым, поэтому сглаживание не сработало.Если вы нарисуете большой прямоугольник на границах полностью прозрачного вида, линия будет рисоваться сглаживанием.Тем не менее, производительность убита.Лучше не идти этим путем.

...