iOS 設置錨點,以錨點爲中心縮放

在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];

    }

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