2013-07-13 2 views
1

Я одушевляю объекты, падающие на доску сверху, и хочу анимировать доску «отступать», когда объекты падают на нее. Объекты могут падать в любую точку на доске, и когда доска «падает», я масштабирую доску в меньшем масштабе.Центрирование CGAffineTransformScale вокруг заданной точки

При использовании CGAffineTransformScale объектов шкалы в зависимости от их точки привязки, центр объекта; Я хочу масштабировать доску, а затем выстраивать преобразованную доску с объектом, который упал на нее, так что упавший объект, похоже, остается в одном и том же месте относительно доски (или, вернее, плата остается в в том же месте относительно положения доски).

Я потратил часы и часы, изменив точку привязки на позицию, в которой объект упал, но это показало фундаментальное недоразумение в моей части того, как работает layer.anchorPoint.

Я предполагаю, что решение выводит вектор от центра до заданного падающего объекта, а затем каким-то образом корректирует положение доски в трансформации, поэтому это одно и то же место. Здесь мне нужна помощь!

Как и следовало ожидать, в этих ситуациях необходим анимированный gif. enter image description here

ответ

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); 

UPDATE : При изменении свойства anchorPoint, вид будет перемещаться, потому что anchorPoint, который установлен относительно слоя в координатном пространстве единицы, привязан к свойству position слоя, который установлен в sup координатное пространство erview. Таким образом, при изменении значения anchorPoint собственности, вид будет двигаться таким образом, что точка в новой точке якорной находится на том же месте, что и старый. Вам необходимо будет компенсировать это, как описано в this answer.

+0

Это то, что я думал, и что я делал, за исключением того, что у меня было какое-то совершенно безумное поведение, когда плата перемещала бы около 100 пикселей в казалось бы случайном направлении (см. Здесь: https://www.dropbox.com/s /5gi3uvcdm02hp5r/awesomemovieofawesomeness.mov В этом видео используется anchorPoint .61,0). Я также отключил автомат. Если точка привязки правильная, то почему она так прыгает? – glenstorey

+0

Единственная разница в том, что я использовал board.frame.size.width, который, как я понимаю, получен из слоя. – glenstorey

+0

@glenstorey, когда вы меняете точку привязки **, представление будет перемещаться ** таким образом, чтобы точка представления в точке привязки находилась в том же месте в супервизии, что и раньше, и это то, что происходит в вашем видео. Вы тоже должны это компенсировать. – Greg