Bạn có thể sử dụng CGPathApply
để lặp qua các yếu tố trong một con đường. Nó phức tạp hơn một chút so với chỉ một lớp lót nhưng nếu bạn gói nó lên trong một hàm trợ giúp đơn giản, nó có thể hữu ích cho bạn. Dưới đây là một phiên bản đó tạo ra một con đường mới và biến đổi nó:
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;
}
}
Để sử dụng nó, bạn sẽ làm gì (đây là phần tôi sẽ đặt bên trong một hàm helper):
PathTransformInfo info;
info.path = CGPathCreateMutable();
info.transform = CGAffineTransformMakeScale(2, 1);
CGPathApply(originalPath, &info, PathTransformer);
Đường dẫn chuyển đổi đang ở trong info.path
vào thời điểm này.
Cảm ơn bạn! Điều này sẽ làm những gì tôi yêu cầu, nhưng thật không may, nó sẽ không cho tôi hiệu suất của việc không phải tạo lại toàn bộ con đường. Nếu đây vẫn là câu trả lời duy nhất, tôi sẽ đánh dấu nó là giải pháp. – MrMage