2011-06-16 55 views
2

纵观苹果的文档倒是例如,有以下方法:锚定点的CALayer

// scale and rotation transforms are applied relative to the layer's anchor point 
// this method moves a gesture recognizer's view's anchor point between the user's fingers 
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     UIView *piece = gestureRecognizer.view; 
     CGPoint locationInView = [gestureRecognizer locationInView:piece]; 
     CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; 

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

第一个问题,有人可以解释设置在子视图的定位点,并改变中心的逻辑superview(就像为什么这样做了)?

最后,数学如何为anchorPoint语句工作?如果你有一个界限为500,500的视图,并且说你用一个手指触摸100,100,用另一个手指触摸500,500。在此框中,您的正常锚点是(250,250)。现在呢? (没有线索)

谢谢!

回答

9

center视图的属性仅仅是其背景层的position属性的反映。令人惊讶的是,这意味着center不必位于您的view的中心。其中position位于其范围内是基于anchorPoint,它取(0,0)和(1,1)之间的任何值。把它看作是position是否在其范围内的标准化指标。如果您要更改anchorPointposition,则边界将自行调整,而不是将位置w.r.t移至其superlayer/superview。所以要重新调整position以便视图的框架不移动,可以操纵center

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

想象原来事情是其中O是触摸点,

+++++++++++ 
+ O  +   +++++++++++ 
+ X + --> + X  + 
+   +   +   + 
+++++++++++   +   + 
        +++++++++++ 

现在,我们希望这X是在其中用户已经接触点。我们这样做是因为所有的缩放和旋转都是基于position/anchorPoint完成的。为了将框架调整回原来的位置,我们将视图的"center"设置为触摸位置。

piece.center = locationInSuperview; 

因此,这反映在视图重新调整它的框架背部,

    +++++++++++ 
+++++++++++   + X  + 
+ X  + --> +   + 
+   +   +   + 
+   +   +++++++++++ 
+++++++++++ 

现在,当用户旋转或鳞片,它将犹如轴是在触摸点,而不是真正的中心发生的看法。

在您的示例中,视图的位置可能最终为平均值,即(300,300),这意味着anchorPoint将为(0.6,0.6),并且响应frame将向上移动。要重新调整,我们将中心移动到触摸位置会将frame向下移动。

+2

@水晶做了这个帮助吗? – 2011-06-19 18:04:46

0

第一个问题,有人可以解释 设置锚点 在子视图,并改变 中心上海华盈(如为什么这 做)的逻辑?

此代码不会改变超视图的中心。它将手势识别器视图的中心更改为手势的位置(在超视图框架中指定的坐标)。该陈述仅仅是在跟随手势的位置的同时在其超视图中移动视图。设置center可以被认为是设置frame的简写方式。

至于锚点,它会影响如何将缩放和旋转变换应用到图层。例如,图层将使用该锚点作为其旋转轴进行旋转。缩放时,所有点都在不会自行移动的锚点周围偏移。

最后,数学如何为 anchorPoint语句工作?如果您有一个 视图,其界限为500,500, ,并且说您使用100,100与一个 手指触摸500,500与另一个。在 这个框中,您的正常定位点是 (250,250)。现在呢? (有没有 线索)

的关键概念要注意的anchorPoint特性是值的点的范围内被宣布为在[0,1],不管什么实际的大小层是。所以,如果你有一个界限(500,500)的视图,并且你在(100,100)和(500,500)处触碰两次,整个手势视图中的位置将是(300,300),并且定位点将是(300/500,300/500)=(0.6,0.6)。