Puede utilizar CGPathApply
para recorrer los elementos de una ruta. Es un poco más complejo que solo un trazador de líneas, pero si lo empaqueta en una sencilla función auxiliar, podría ser útil para usted. Aquí es una versión que crea un nuevo camino y lo transforma:
typedef struct {
CGMutablePathRef path;
CGAffineTransform transform;
} PathTransformInfo;
static void
PathTransformer(void *info, const CGPathElement *element)
{
PathTransformInfo *transformerInfo = info;
switch (element->type) {
case kCGPathElementMoveToPoint:
CGPathMoveToPoint(transformerInfo->path, &transformerInfo->transform,
element->points[0].x, element->points[0].y);
break;
case kCGPathElementAddLineToPoint:
CGPathAddLineToPoint(transformerInfo->path, &transformerInfo->transform,
element->points[0].x, element->points[0].y);
break;
case kCGPathElementAddQuadCurveToPoint:
CGPathAddQuadCurveToPoint(transformerInfo->path, &transformerInfo->transform,
element->points[0].x, element->points[0].y,
element->points[1].x, element->points[1].y);
break;
case kCGPathElementAddCurveToPoint:
CGPathAddCurveToPoint(transformerInfo->path, &transformerInfo->transform,
element->points[0].x, element->points[0].y,
element->points[1].x, element->points[1].y,
element->points[2].x, element->points[2].y);
break;
case kCGPathElementCloseSubpath:
CGPathCloseSubpath(transformerInfo->path);
break;
}
}
Para usarlo usted haría (esta es la parte que me gustaría poner dentro de una función de ayuda):
PathTransformInfo info;
info.path = CGPathCreateMutable();
info.transform = CGAffineTransformMakeScale(2, 1);
CGPathApply(originalPath, &info, PathTransformer);
El camino transformado está en info.path
en este punto.
Gracias! Esto hará lo que solicité, pero desafortunadamente no me dará la ganancia de rendimiento de no tener que recrear todo el camino. Si esta sigue siendo la única respuesta, lo marcaré como la solución. – MrMage