CALayer中的锚点是什么?

3

从苹果的文档中查看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;
    }
}

首先问题是,有人能解释一下在子视图中设置锚点并改变父视图的中心的逻辑吗?为什么要这样做?

最后,锚点语句的数学计算是如何工作的?如果您有一个边界为500、500的视图,并用一只手指触摸100、100,另一只手指触摸500、500。在这个框中,您的正常锚点是(250, 250)。现在它是多少?(完全不知道)

谢谢!

2个回答

10
视图的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),这意味着锚点将是(0.6,0.6),相应地frame将向上移动。为了重新调整,我们将中心移动到触摸位置会使frame向下移动。

0
首先的问题,有人可以解释一下在子视图中设置锚点的逻辑,以及改变父视图的中心(为什么要这样做)吗?
这段代码并没有改变父视图的中心。它是将手势识别器视图的中心更改为手势的位置(坐标在父视图的框架中指定)。这个语句只是在其父视图中移动视图,同时跟随手势的位置。设置`center`可以看作是一种设置`frame`的简写方式。
至于锚点,它影响到如何应用于图层的缩放和旋转变换。例如,一个图层将以该锚点为轴进行旋转。在缩放时,所有点都围绕锚点进行偏移,而锚点本身不会移动。
最后,关于锚点语句的数学计算是如何工作的?如果你有一个边界为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)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接