können Sie CGPathApply
verwenden, um durch die Elemente in einem Pfad zu durchlaufen. Es ist ein bisschen komplexer als nur ein Einzeiler, aber wenn Sie es in einer einfachen Hilfsfunktion verpacken, könnte es für Sie nützlich sein. Hier ist eine Version, die einen neuen Weg erzeugt und transformiert es:
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;
}
}
es nutzen zu können, tun würde (das ist der Teil I in einer Hilfsfunktion setzen würde):
PathTransformInfo info;
info.path = CGPathCreateMutable();
info.transform = CGAffineTransformMakeScale(2, 1);
CGPathApply(originalPath, &info, PathTransformer);
Der transformierte Weg ist in info.path
an diesem Punkt.
Thank you! Das wird tun, wonach ich gefragt habe, aber leider wird es mir nicht den Leistungsgewinn bringen, den gesamten Pfad nicht neu erstellen zu müssen. Wenn dies die einzige Antwort bleibt, werde ich es als Lösung markieren. – MrMage