2011-05-13 67 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)