MrM*_*age 5 core-graphics cgcontext cgaffinetransform cgpath stroke
我有一个CGPath我想绘制的坐标系.这样做涉及将旧坐标系缩放到Context的坐标系上.为了这个目的,我使用CGContextConcatCTM()它确实转换所有点.但是,由于它是缩放操作,水平/垂直线宽变为.例如,在x方向上为10,但在y方向上为1,将导致垂直线的厚度是水平线的10倍.有没有办法保持翻译矩阵的易用性(例如CGAffineTransform),但不能同时缩放线宽,例如像CGPathApplyAffineTransformToPoints?
干杯
MrMage
添加路径时进行转换,但在描边路径之前删除转换.而不是这个:
CGContextSaveGState(ctx);
CGContextScaleCTM(ctx, 10, 10); // scale path 10x
CGContextAddPath(ctx, somePath);
CGContextSetStrokeColorWithColor(ctx, someColor);
CGContextSetLineWidth(ctx, someWidth); // uh-oh, line width is 10x, too
CGContextStrokePath(ctx);
CGContextRestoreGState(ctx); // back to normal
Run Code Online (Sandbox Code Playgroud)
做这个:
CGContextSaveGState(ctx);
CGContextScaleCTM(ctx, 10, 10); // scale path 10x
CGContextAddPath(ctx, somePath);
CGContextRestoreGState(ctx); // back to normal
CGContextSetStrokeColorWithColor(ctx, someColor);
CGContextSetLineWidth(ctx, someWidth);
CGContextStrokePath(ctx);
Run Code Online (Sandbox Code Playgroud)
您可以使用它CGPathApply来迭代路径中的元素。它比单行代码稍微复杂一些,但如果您将其打包在一个简单的辅助函数中,它可能对您有用。这是创建新路径并对其进行转换的一个版本:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它,您需要执行以下操作(这是我将放入辅助函数中的部分):
PathTransformInfo info;
info.path = CGPathCreateMutable();
info.transform = CGAffineTransformMakeScale(2, 1);
CGPathApply(originalPath, &info, PathTransformer);
Run Code Online (Sandbox Code Playgroud)
变换后的路径就在info.path此时。