Как продолжать вращать представление с CAKeyFrameAnimation? - PullRequest
1 голос
/ 02 февраля 2010

Я пытаюсь сделать это: есть вид, который уже повернут к некоторому значению, скажем, на 15 градусов.

Представьте себе вид, повернутый на 15 градусов.

Далее, я только знаю, что я хочу, чтобы это представление вращалось от его текущего вращения до 40 градусов.

Представьте, как этот вид теперь поворачивается от 15 до 40 градусов.

Для практики я хочу сделать это с CAKeyFrameAnimation. Но дело в том, что все, что я могу сделать, это жестко указать, откуда и куда. Там нет удобной вещи "забрать текущее состояние", как UIView анимации, верно? Как бы я пошел об этом?

Кроме того, я хочу всегда указывать 3 ключевых кадра для этого вращения, независимо от того, сколько требуется количество вращения.

Представьте, как этот вид поворачивается от 15 до 40 градусов, используя для этого 3 ключевых кадра

Но есть еще одна большая проблема: может случиться так, что другая анимация столкнется с другой целью. Допустим, в данный момент вид вращается от 20 до 100 градусов, и где-то между анимацией запускается новая анимация, и он хочет, чтобы этот вид достиг 15 градусов. С анимацией UIView это просто. Как это сделать с CAKeyFrameAnimation?

В основном я хочу, чтобы он вел себя как анимация UIView, которая подхватывает текущее состояние;)

CALayer* theLayer = rotatedView.layer;

CAKeyframeAnimation* animation;
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

animation.duration = 2;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

animation.values = [NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:(10.0 / 180.0) * M_PI],
                    [NSNumber numberWithFloat:(20.0 / 180.0) * M_PI],
                    [NSNumber numberWithFloat:(30.0 / 180.0) * M_PI], nil];

[theLayer addAnimation:animation forKey:@"transform.rotation.z"];

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Вы можете использовать theLayer.transform или theLayer.affineTransform для получения текущей матрицы преобразования (до анимации), затем используйте iphone sdk CGAffineTransform для получения угла поворота объекта , чтобы получить угол для запуска с.

0 голосов
/ 02 февраля 2010

Вы можете получить начальный угол для использования при настройке анимации, используя код, подобный тому, который я предоставляю в этот ответ :

CATransform3D rotationTransform = [theLayer transform];
float angle;
if (rotationTransform.m11 < 0.0f)
        angle = 180.0f - (asin(rotationTransform.m12) * 180.0f / M_PI);
else
        angle = asin(rotationTransform.m12) * 180.0f / M_PI;

или с использованием более простого вспомогательного метода keypath , предложенного здесь :

float currentAngle = ([[theLayer valueForKeyPath:@"transform.rotation.z"] floatValue] * 180.0f / M_PI);

Если вы добавляете эту анимацию к той, которая уже выполняется, вам нужно будет запросить текущий угол представления Layer presentationLayer, а не непосредственно theLayer. PresentationLayer для CALayer отражает текущее состояние середины анимации слоя.

...