這是一個棘手的問題。參考UIView關於幀屬性的文檔,它指出:
警告:如果transform屬性不是標識轉換,則此屬性的值是未定義的,因此應該忽略。
所以訣竅是找到一個解決方法,它取決於你確切的需要。如果你只需要一個近似值,或者如果你的旋轉總是90度的倍數,那麼CGRectApplyAffineTransform()函數可能工作得很好。將它傳遞給感興趣的UIButton的(未轉換的)框架,以及按鈕的當前轉換,它會給你一個轉換矩形。請注意,由於rect被定義爲原點,寬度和高度,因此無法定義邊長不平行於屏幕邊的矩形。在不平行的情況下,它將返回旋轉矩形的最小可能的邊界矩形。
現在,如果你需要知道一個或全部轉化點的精確座標,我已經寫代碼之前計算它們,但它是一個有點更復雜:
- (void)computeCornersOfTransformedView:(UIView*)transformedView relativeToView:(UIView*)parentView {
/* Computes the coordinates of each corner of transformedView in the coordinate system
* of parentView. Each is corner represented by an independent CGPoint. Doesn't do anything
* with the transformed points because this is, after all, just an example.
*/
// Cache the current transform, and restore the view to a normal position and size.
CGAffineTransform cachedTransform = transformedView.transform;
transformedView.transform = CGAffineTransformIdentity;
// Note each of the (untransformed) points of interest.
CGPoint topLeft = CGPointMake(0, 0);
CGPoint bottomLeft = CGPointMake(0, transformedView.frame.size.height);
CGPoint bottomRight = CGPointMake(transformedView.frame.size.width, transformedView.frame.size.height);
CGPoint topRight = CGPointMake(transformedView.frame.size.width, 0);
// Re-apply the transform.
transformedView.transform = cachedTransform;
// Use handy built-in UIView methods to convert the points.
topLeft = [transformedView convertPoint:topLeft toView:parentView];
bottomLeft = [transformedView convertPoint:bottomLeft toView:parentView];
bottomRight = [transformedView convertPoint:bottomRight toView:parentView];
topRight = [transformedView convertPoint:topRight toView:parentView];
// Do something with the newly acquired points.
}
請原諒任何輕微代碼中的錯誤,我寫在瀏覽器中。不是最有用的IDE ...
這很令人驚訝,你可以編寫像IN IN BROWSER這樣的代碼。哇!我不會越過這個「空白」,因爲我忘記了如何拼寫,並且必須從另一個項目中複製和粘貼。 – Fattie 2011-01-13 08:04:31