あなたは、パス内の要素を反復処理するCGPathApply
を使用することができます。 1つのライナーより少し複雑ですが、簡単なヘルパー関数でパッケージ化すれば、あなたにとっては便利かもしれません。
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;
}
}
を、あなたはどうしたらそれを使用するには(これは私がヘルパー関数の内部で置く部分です):ここに新しいパスを作成し、それを変換バージョンは1つである
PathTransformInfo info;
info.path = CGPathCreateMutable();
info.transform = CGAffineTransformMakeScale(2, 1);
CGPathApply(originalPath, &info, PathTransformer);
変換パスこの時点でinfo.path
にあります。
ありがとうございました!これは私が求めたことをするでしょうが、残念ながらパス全体を再作成する必要がないというパフォーマンスの向上は得られません。これが唯一の答えである場合、私はそれを解決策としてマークします。 – MrMage