1. 程式人生 > >ios中關於對錨點的理解

ios中關於對錨點的理解

錨點在ios中見到的地方不多,大部分用在動畫中。

今天看到一個動畫,上面都是關於錨點的,錨點這個概念在兩年前看cocos2d得基本概念時接觸過,當時沒怎麼看,今天看到了,就在好好的學一下。

看了一篇blog,是關於錨點的,就借鑑一些上面的影象:

cocos2d裡採用OpenGL ES座標系,座標原點在螢幕左下角。而ios採用的是Quartz 2D座標系,座標原點在螢幕左上角。

在cocos2d和ios中分別把檢視的座標點設為(10,10),結果如下:


那麼什麼是錨點呢?下面以一個例子來說明:
比如要建立以下兩個檢視,藍色檢視左上角在座標(5,4)處,而橙色檢視右邊和藍色檢視對齊,有一半的高度處於藍色檢視外面。



按照ios標準的建立檢視的寫法可以這樣寫程式碼:

  1. UIView*blueView =[[UIView alloc] initWithFrame:CGRectMake(5,4, W, H)];
  2. blueView.backgroundColor =[UIColor blueColor];
  3. [self.view addSubview:blueView];
  4. UIView*orangeView =[[UIView alloc] initWithFrame:CGRectMake(W-w, H-h/2, w, h)];
  5. orangeView.backgroundColor =[UIColor orangeColor
    ];
  6. [blueView addSubview:orangeView];

可以看到建立檢視時就要計算檢視左上角的座標,非常麻煩。而使用了錨點的程式碼可以這樣寫:

  1. UIView*blueView =[[UIView alloc] initWithSize:CGSizeMake(W, H)];
  2. [blueView setPosition:CGPointMake(5,4) atAnchorPoint:CGPointMake(0,0)];
  3. blueView.backgroundColor =[UIColor blueColor];
  4. [self.view addSubview:blueView];
  5. UIView*orangeView
    =[[UIView alloc] initWithSize:CGSizeMake(w, h)];
  6. [orangeView setPosition:CGPointMake(W, H) atAnchorPoint:CGPointMake(1,0.5)];
  7. orangeView.backgroundColor =[UIColor orangeColor];
  8. [blueView addSubview:orangeView];
可見,使用錨點省去了苦逼的計算過程。當然了,錨點也是針對子檢視去設計的,錨點掌握好了,我們就不用再去計算x,y座標了。

就拿上面這個例子分析一下吧:

把俯檢視藍色view的左邊點(W,H)作為自身的錨點(1,0.5)【注意:錨點是在自身上找,這個點一一對映的有一個父view的座標,可以通過這兩個值來計運算元檢視的view.frame.origin】.

好好理解上句話,錨點的座標範圍如下:


這是在Quartz 2D座標系中得錨點。

下面看一下程式碼中把父檢視的點作為自身錨點的方法。

- (void)setPosition:(CGPoint)point atAnchorPoint:(CGPoint)anchorPoint
{
    CGFloat x = point.x - anchorPoint.x * self.width;
    CGFloat y = point.y - anchorPoint.y * self.height;
    [self setOrigin:CGPointMake(x, y)];
}