查看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)。现在是???? (毫无头绪)
谢谢!
答案 0 :(得分:9)
视图的center
属性仅仅反映了其后备层的position
属性。令人惊讶的是,这意味着center
不必位于view
的中心。 position
位于其边界内的位置基于anchorPoint
,它接收(0,0)和(1,1)之间的任何值。可以将其视为position
是否在其范围内的标准化指标。如果您要更改anchorPoint
或position
,则边界将自行调整,而不是将位置转换为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)。