CGLayer и сглаженные CGPaths
Я рисую несколько 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
быть гладким?
1 ответ
Я нашел причину, по которой второе изображение не является сглаженным, потому что не было ничего против сглаживания. Фон был пустым, поэтому сглаживание не сработало. Если вы нарисуете большой прямоугольник на границах полностью прозрачного вида, линия будет рисоваться сглаживанием. Тем не менее, производительность убита. Лучше не идти этим путем.