我正在设置从上方落到板子上的物体,我希望在物体落在它上面时让板子“倒退”。物体可以落在电路板上的任何位置,当电路板“倒退”时,我会将电路板缩小到较小的比例。
当使用CGAffineTransformScale对象时,基于其锚点,对象的中心进行缩放;我想缩放电路板,然后将变形后的电路板与落在其上的物体对齐,这样已经掉落的物体似乎与电路板保持在同一个位置(或者更准确地说,电路板保持在与董事会职位相同的地方。)
我花了几个小时,几个小时将锚点改为对象落下的位置,但这揭示了我对layer.anchorPoint实际工作方式的一个根本误解。
我想解决方案是从板的中心到给定的下落物体得到一个矢量,然后以某种方式调整板在转换中的位置,这样它就是同一个地方。这是我需要帮助的地方!
正如您在这些情况下所期望的那样,需要动画gif。
答案 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。