2011-05-13 73 views
3

我已经创建了一个包含iOS应用几何形状的自定义覆盖图。我想旋转它的中心(或者是boundingMapRect的中心)。据我所知,使用CGContextRotateCTM(contextRef,angle)将boundingMapRect的左上角作为原点来旋转覆盖图,所以如果我顺时针旋转我的覆盖图一小段时间,它就会出现在它的前一个位置的左侧。如何在地图上正确旋转覆盖图?

我认为,如果我可以捕获覆盖的边界矩形的初始中心,那么旋转后的中心,然后我可以计算出坐标差异并使用CGContextTranslateCTM重新定位覆盖。我的问题是CGContextRotateCTM调用之前和之后的中心位置相同。有什么方法可以强制实施该呼叫,以便我可以获得新的中心位置?有一个更好的方法吗?

我看到一些参考使用覆盖层的宽度和高度的一半来重新定位,但我不明白这是如何帮助,因为它是恒定的。

谢谢。

回答

0

您是否尝试过设置旋转的锚点?设置定位点后,旋转将位于视图的中心附近。

服用点,如:

[yourView.layer setAnchorPoint:CGPointMake(0.5, 0.5)]; // center of the view 

有关详细信息,请参阅Apple docs

+0

事后如何旋转?并且您的Apple文档链接不存在。 – coolcool1994 2014-04-24 16:51:01

0

这里是我的解决方案,迅速上运行3:

假设centerPoint是要绕一个CGPoint

let a = sqrt(pow(centerPoint.x, 2.0) + pow(centerPoint.y, 2.0)) 

let sub1 = (centerPoint.y/a) * cos(angle/2.0) 
let sub2 = (centerPoint.x/a) * sin(angle/2.0) 
let deltaX = -2 * a * sin((0 - angle)/2.0) * (sub1 + sub2) 

let sub3 = (centerPoint.x/a) * cos(angle/2.0) 
let sub4 = (centerPoint.y/a) * sin(angle/2.0) 
let deltaY = 2 * a * sin((0 - angle)/2.0) * (sub3 - sub4) 

context.translateBy(x: deltaX, y: deltaY) 

context.rotate(by: angle)