这个非常简单的代码......
CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(-50, -50, 100, 100), NULL);
NSLog(@"Original path bounds = %@", NSStringFromRect(CGPathGetBoundingBox(path)));
CGAffineTransform t = CGAffineTransformMakeRotation(0.75 * M_PI);
CGPathRef tPath = CGPathCreateCopyByTransformingPath(path, &t);
NSLog(@"Transformed path bounds = %@", NSStringFromRect(CGPathGetBoundingBox(tPath)));
CGPathRelease(path);
CGPathRelease(tPath);
...产生以下奇怪的输出:
[...] Original path bounds = {{-50, -50}, {100, 100}}
[...] Transformed path bounds = {{-54.881553646890872, -54.881553646890872}, {109.76310729378174, 109.76310729378174}}
因为它是以(0,0)为中心的圆圈,所以不应该保留原始边界框的任何旋转吗?为什么地球上有边界框?或者它是苹果虫?
答案 0 :(得分:2)
这里的问题是CGPathGetBoundingBox()函数包含用于构造圆的贝塞尔曲线的控制点。这些控制点位于圆圈之外,因此当您旋转圆圈时,它们自然会在原始边界框之外结束。
解决方案是使用CGPathGetPathBoundingBox()函数,该函数在计算路径边界框时不包含控制点。