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