2011-08-29 81 views

回答

18

這是一個函數,使用相同的格式作爲CoreGraphics CGAffineTransform API格式。

這與其他「RotateAt()」API的工作原理完全相同。

該操作表示等效於以下規範:translate(pt.x,pt.y);旋轉(角度); translate(-pt.x,-pt.y);

CGAffineTransform CGAffineTransformMakeRotationAt(CGFloat angle, CGPoint pt){ 
    const CGFloat fx = pt.x, fy = pt.y, fcos = cos(angle), fsin = sin(angle); 
    return CGAffineTransformMake(fcos, fsin, -fsin, fcos, fx - fx * fcos + fy * fsin, fy - fx * fsin - fy * fcos); 
} 

就像CGAffineTransformMakeRotation()一樣,角度是弧度而不是度數。

+1

我假設pt是一箇中心? – Andy

+0

爲什麼你不能只做一個'var t = CGAffineTransformMakeTranslation(-pt.x,-pt.y)',然後用't = CGAffineTransformRotate(t,angel)'做旋轉,然後用'var t = CGAffineTransformTranslate(t,pt.x,pt.y)'? – Adam

+1

@亞當這是你必須做的3件事。我的回答是一個呼籲做這三個。非常優化。請重新閱讀我的答案,尤其是代碼前的第三行。 – Andy

1

我剛剛給了這個鏡頭。喜歡的東西應該給你你正在尋找...

- (void)rotateView:(UIView *)view aroundPoint:(CGPoint)point withAngle:(double)angle{ 
    //save original view center 
    CGPoint originalCenter = view.center; 

    //set center of view to center of rotation 
    [view setCenter:point]; 

    //apply a translation to bring the view back to its original point 
    view.transform = CGAffineTransformMakeTranslation(originalCenter.x, originalCenter.y); 

    //multiply the view's existing rotation matrix (the translation) by a rotation and apply it to the view 
    //thereby making it rotate around the external point 
    view.transform = CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(angle)); 
} 

只是爲了解釋我的推理有點結果......

什麼我們基本上做視圖物理轉向點的旋轉,然後應用翻譯使其看起來像停留在原始點。然後,如果我們將旋轉乘以視圖的新平移,則我們基本上旋轉整個視圖及其座標系,因此看起來就像它在給定點附近旋轉一樣。我希望我解釋得很好。 :|如果沒有,我建議在網上查找轉換矩陣,也許你可以找到更好的解釋他們如何堆積在那裏!

2

將圖像視圖的圖層的anchorPoint設置爲(0,0)和(1,1)以外的內容,即view.layer.anchorPoint = CGPointMake(2,2)。

+0

如果你記住了兩件事:a)這將完全改變你的視圖的繪製位置,而不僅僅是轉換b)我相信anchorPoint的x和y值是視圖大小的倍數。它們不在主視圖座標系中。 – mjisrawi

2

我已經用這種方法解決了: 我把UIImage,我想旋轉到另一個視圖。 該視圖是最大的圖像視圖,所以視圖的中心點是uiimage視圖的外部點,所以我旋轉視圖....