2011-06-16 56 views
2

縱觀蘋果的文檔倒是例如,有以下方法:錨定點的CALayer

// scale and rotation transforms are applied relative to the layer's anchor point 
// this method moves a gesture recognizer's view's anchor point between the user's fingers 
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     UIView *piece = gestureRecognizer.view; 
     CGPoint locationInView = [gestureRecognizer locationInView:piece]; 
     CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; 

     piece.layer.anchorPoint = CGPointMake(locationInView.x/piece.bounds.size.width, locationInView.y/piece.bounds.size.height); 
     piece.center = locationInSuperview; 
    } 
} 

第一個問題,有人可以解釋設置在子視圖的定位點,並改變中心的邏輯superview(就像爲什麼這樣做了)?

最後,數學如何爲anchorPoint語句工作?如果你有一個界限爲500,500的視圖,並且說你用一個手指觸摸100,100,用另一個手指觸摸500,500。在此框中,您的正常錨點是(250,250)。現在呢? (沒有線索)

謝謝!

回答

9

center視圖的屬性僅僅是其背景層的position屬性的反映。令人驚訝的是,這意味着center不必位於您的view的中心。其中position位於其範圍內是基於anchorPoint,它取(0,0)和(1,1)之間的任何值。把它看作是position是否在其範圍內的標準化指標。如果您要更改anchorPointposition,則邊界將自行調整,而不是將位置w.r.t移至其superlayer/superview。所以要重新調整position以便視圖的框架不移動,可以操縱center

piece.layer.anchorPoint = CGPointMake(locationInView.x/piece.bounds.size.width, locationInView.y/piece.bounds.size.height); 

想象原來事情是其中O是觸摸點,

+++++++++++ 
+ O  +   +++++++++++ 
+ X + --> + X  + 
+   +   +   + 
+++++++++++   +   + 
        +++++++++++ 

現在,我們希望這X是在其中用戶已經接觸點。我們這樣做是因爲所有的縮放和旋轉都是基於position/anchorPoint完成的。爲了將框架調整回原來的位置,我們將視圖的"center"設置爲觸摸位置。

piece.center = locationInSuperview; 

因此,這反映在視圖重新調整它的框架背部,

    +++++++++++ 
+++++++++++   + X  + 
+ X  + --> +   + 
+   +   +   + 
+   +   +++++++++++ 
+++++++++++ 

現在,當用戶旋轉或鱗片,它將猶如軸是在觸摸點,而不是真正的中心發生的看法。

在您的示例中,視圖的位置可能最終爲平均值,即(300,300),這意味着anchorPoint將爲(0.6,0.6),並且響應frame將向上移動。要重新調整,我們將中心移動到觸摸位置會將frame向下移動。

+2

@水晶做了這個幫助嗎? – 2011-06-19 18:04:46

0

第一個問題,有人可以解釋 設置錨點 在子視圖,並改變 中心上海華盈(如爲什麼這 做)的邏輯?

此代碼不會改變超視圖的中心。它將手勢識別器視圖的中心更改爲手勢的位置(在超視圖框架中指定的座標)。該陳述僅僅是在跟隨手勢的位置的同時在其超視圖中移動視圖。設置center可以被認爲是設置frame的簡寫方式。

至於錨點,它會影響如何將縮放和旋轉變換應用到圖層。例如,圖層將使用該錨點作爲其旋轉軸進行旋轉。縮放時,所有點都在不會自行移動的錨點周圍偏移。

最後,數學如何爲 anchorPoint語句工作?如果您有一個 視圖,其界限爲500,500, ,並且說您使用100,100與一個 手指觸摸500,500與另一個。在 這個框中,您的正常定位點是 (250,250)。現在呢? (有沒有 線索)

的關鍵概念要注意的anchorPoint特性是值的點的範圍內被宣佈爲在[0,1],不管什麼實際的大小層是。所以,如果你有一個界限(500,500)的視圖,並且你在(100,100)和(500,500)處觸碰兩次,整個手勢視圖中的位置將是(300,300),並且定位點將是(300/500,300/500)=(0.6,0.6)。