CGPath缩放遇到问题

3
我正在使用CGPath绘制多边形,并将其添加到CAShapeLayer中。当用户单击它时,我想要缩放我的CGPath。我知道如何缩放CGPath。但是当我点击我的CGPath时,它绘制的位置不在中心,而我是在中心绘制多边形。
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
CGPathRef oldPath = polygonLayer.path;
CGPathRef scaledPath = CGPathCreateCopyByTransformingPath(oldPath, &scaleTransform);
polygonLayer.path = scaledPath;

那么问题出在哪里?屏幕上显示的与您的需求不符是什么? - CodenameLambda1
1
我已经绘制了多边形,然后尝试对其进行缩放,但是当我缩放多边形时,缩放后的多边形会在不同的位置绘制,而不是在我最初绘制多边形的位置。 - h999
1个回答

4
问题在于您习惯了UIView的变换,这是从视图中心进行的。
CGPath的变换是在点上进行的(将CGPointZero想象为路径的中心)。
我的解决方案:先将其转换为CGPointZero,再进行缩放,最后回到原始坐标系。
CGPathRef CGPath_NGCreateCopyByScalingPathAroundCentre(CGPathRef path,
                                           const float scale)
{
    CGRect bounding = CGPathGetPathBoundingBox(path);
    CGPoint pathCenterPoint = CGPointMake(CGRectGetMidX(bounding), CGRectGetMidY(bounding));

    CGAffineTransform translateAndScale = CGAffineTransformTranslate( CGAffineTransformMakeScale(scale, scale), - pathCenterPoint.x, -pathCenterPoint.y) ;
    CGAffineTransform translateBack = CGAffineTransformMakeTranslation(pathCenterPoint.x, pathCenterPoint.y);

    CGPathRef centeredAndScaled = CGPathCreateCopyByTransformingPath(path, &translateAndScale);
    CGPathRef translatedPathRef = CGPathCreateCopyByTransformingPath(centeredAndScaled, &translateBack);

    CGPathRelease(centeredAndScaled);

    return translatedPathRef;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接