Bezdepbonusu7Программирование: статьи и ответы

Вопрос

CGLayer и CGPath с антиалиасингом

Автор вопроса: StreeterОтветов: 1

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

Итак, что я делаю сейчас, так это визуализирую путь внутри 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 плавными?

iphonecocoaipadquartz-2dquartz-graphics

Ответы

Ответ 1 · рейтинг 3 · Streeter

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы