CALayer中的锚点

时间:2011-06-16 23:09:21

标签: iphone uiview uigesturerecognizer

查看Apple文档中的Touches示例,有这种方法:

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

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

最后,数学如何为anchorPoint语句工作?如果你的视图边界为500,500,并且说你用100,100用一根手指触摸,500,500用另一根触摸。在此框中,您的常规锚点为(250,250)。现在是???? (毫无头绪)

谢谢!

2 个答案:

答案 0 :(得分:9)

视图的center属性仅仅反映了其后备层的position属性。令人惊讶的是,这意味着center不必位于view的中心。 position位于其边界内的位置基于anchorPoint,它接收(0,0)和(1,1)之间的任何值。可以将其视为position是否在其范围内的标准化指标。如果您要更改anchorPointposition,则边界将自行调整,而不是将位置转换为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向下移动。

答案 1 :(得分: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)。