Я рисую несколько 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
плавными?