利用anchorPoint和position實現縮放


通過anchorPoint和position的設置,可以實現視圖的縮放和旋轉

在默認情況下,如圖1所示,一個layer的anchorPoint爲(0.5,0.5),layer的position是anchorPoint在它的父視圖中的相對座標;view.center是anchorPoint在父視圖中的座標,(而不是相對於自己的center),在默認情況下它與position相等。


然而position與anchorPoint之間改動其中一個,並不影響另外一個,而是會改變frame值,使position與anchorPoint都滿足設定要求。比如,將anchorPoint修改爲(0,0),那麼anchorPoint在當前View中位置變化到左上角(0,0)處,如圖2,但是position的並不會受到影響,即anchorPoint在superView中座標位置不變,這是這就需要通過修改view的frame值來實現,view的frame從圖一平移到圖2 狀態。同理,修改position也會導致view的frame發生變化。


在實際應用中,最好將position與anchorPoint對應上,防止縮放中產生偏移問題。


 圖1是默認情況

                                                    圖1                                             圖2


View 是圍繞它的anchorPoint來縮放的,在實際的縮放應用中,我們通常需要圍繞某一特定點進行縮放。這時,就需要將anchorPoint設置成該點位置。如圖3-1所示,假如我們像讓View圍繞(x,y)點縮放,那麼我們需要先計算出這一點在View中對應的anchorPoint值:
anchorPoint_x = x/self.frame.size.width;
anchorPoint_y = y/self.frame.size.height;
anchorPoint的目標位置已經計算好了,但這時候如果直接設置anchorPoint,會導致View的frame發生變化,導致位移成圖3-2位置,若縮放時有動畫,會導致動畫不連續。

                                                        圖3-1                                                  圖3-2




所以進行移動和縮放時,要首先將position和anchorPoint對應:


<span style="font-size:18px;">self.layer.position = CGPointMake(tapPoint.x+self.frame.origin.x, tapPoint.y+self.frame.origin.y);
self.layer.anchorPoint = CGPointMake(tapPoint.x/self.bounds.size.width, tapPoint.y/self.bounds.size.height);</span>

圖4
這樣連續兩部操作後,就使anchorPoint和Position真正變成選定的位置,圖4,而不改變view的frame值,後續可以實現View animate的放大動畫。
-------------------------
進一步,如果將需要放大的中心點(此處是anchorPoint)移到屏幕中間,需要將view的center移動到superView的中心點位置


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章