围绕给定点对齐CGAffineTransformScale

时间:2013-07-13 01:50:13

标签: objective-c cocoa-touch animation cgaffinetransform

我正在设置从上方落到板子上的物体,我希望在物体落在它上面时让板子“倒退”。物体可以落在电路板上的任何位置,当电路板“倒退”时,我会将电路板缩小到较小的比例。

当使用CGAffineTransformScale对象时,基于其锚点,对象的中心进行缩放;我想缩放电路板,然后将变形后的电路板与落在其上的物体对齐,这样已经掉落的物体似乎与电路板保持在同一个位置(或者更准确地说,电路板保持在与董事会职位相同的地方。)

我花了几个小时,几个小时将锚点改为对象落下的位置,但这揭示了我对layer.anchorPoint实际工作方式的一个根本误解。

我想解决方案是从板的中心到给定的下落物体得到一个矢量,然后以某种方式调整板在转换中的位置,这样它就是同一个地方。这是我需要帮助的地方!

正如您在这些情况下所期望的那样,需要动画gif。 enter image description here

1 个答案:

答案 0 :(得分:2)

CALayer's anchorPoint property 用于此的正确属性,其中一个小烦恼是它在单位坐标空间中起作用,即从0变为1 ,而不是像素:

  

使用单位坐标空间指定此属性的值。此属性的默认值为(0.5,0.5),表示图层边界矩形的中心。对视图的所有几何操作都发生在指定点附近。例如,将旋转变换应用于具有默认锚点的图层会导致图层围绕其中心旋转。将锚点更改为其他位置将导致图层围绕该新点旋转。

因此,以像素为单位设置锚点显然会导致一些非常奇怪的行为。你需要在单位坐标空间中计算你的新锚点才能使它正常工作,所以,而不是做这样的事情:

board.layer.anchorPoint = CGPointMake(ball.x, ball.y);

你会这样做:

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

更新:当您更改anchorPoint属性时,视图将移动,因为anchorPoint是相对于图层设置的在单位坐标空间中,锚定到图层的position属性,该属性在superview的坐标空间中设置。这样,当您更改anchorPoint属性的值时,视图将移动,使新锚点处的点与旧锚点处于同一位置。您需要对此进行补偿,如this answer

中所述