iOS錨點的講解

王正魁發表於2015-12-22

在CALayer中有一個很重要的概念,就是錨點,錨點是針對CALayer來說的,錨點到底是什麼呢?讓我們看看錨點到底是什麼?一下都是針對CALayer來說的。

首先我們先說一下什麼CALayer,CALayer就是一個圖層,可以讓我們看見的東西,但是他不具有事件,為了讓我們既能看得見又能操作,所以就在繼承UIResponder來擴充套件了一個CALayer,這就是UIView,所以UIView有一個CALayer的原因,我們用的button和UIIimageView,UILabel等等很多控制元件都是繼承UIView的,這樣我們看得見又有事件,說白了就是在事件上加了一層圖層,當我們多動一個控制元件的時候,僅僅改變控制元件的center是不行的,同時我們需要改變這個控制元件的layer的錨點。

有了一上的瞭解,我們來說說錨點。


我們在xib中拖一個UIImageView,而UIImageView的位置時從父檢視的左上角0,0點開始計算的,但是UIImageView的center的計算是從父檢視左上角0,0點開始的,

UIImageView的錨點是針對layer來說的,錨點是相對於UIImageView自身的,也是position所指的位置,預設就是(0.5,0.5),就是UIImageView自己的中心,以錨點為參考點,相對父檢視的位置就是center,因為是(0.5,0.5)嘛,當我們點選圖片時,我們點選的在UIImageView上的位置和UIImageView自身大小相比的值,讓這個值作為錨點的位置,改變這個位置可以在拖動、縮放等操作時,不會出現閃跳的現象,原因就是錨點變了,錨點變了,原來的UIImageView的Center也要改變,記住center是相對父檢視的,要從父檢視中拿。讓相對父檢視的center和相對自身的錨點重合,就完成了。簡單的說錨點就是UIImageView在父檢視中位置計算參考點,以這個點來計算UIImageView在父檢視中的位置。

下邊的程式碼是:當拖動或者是縮放一個圖片時,對錨點的重新設定。之後再去改變位置

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer

{

    //UIGestureRecognizerStateBegan意味著手勢已經被識別

    if (gestureRecognizer.state ==UIGestureRecognizerStateBegan)

    {

        //手勢發生在哪個view

        UIView *piece = gestureRecognizer.view;

        //獲得當前手勢在view上的位置。

        CGPoint locationInView = [gestureRecognizerlocationInView:piece];

        

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

        //根據在view上的位置設定錨點。

        //防止設定完錨點過後,view的位置發生變化,相當於把view的位置重新定位到原來的位置上。

        CGPoint locationInSuperview = [gestureRecognizerlocationInView:piece.superview];

        piece.center = locationInSuperview;

    }

}

//縮放事件

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer

{

    [selfadjustAnchorPointForGestureRecognizer:gestureRecognizer];

  

    

    if ([gestureRecognizerstate] ==UIGestureRecognizerStateBegan || [gestureRecognizerstate] ==UIGestureRecognizerStateChanged)

    {

        [gestureRecognizer view].transform =CGAffineTransformScale([[gestureRecognizerview]transform], [gestureRecognizerscale], [gestureRecognizerscale]);

        [gestureRecognizer setScale:1];

        

    }

    

}



相關文章