Принудительное вращение по часовой стрелке / против часовой стрелки для CABasicAnimation UIImageView - PullRequest
8 голосов
/ 12 августа 2010

Я оживляю маятник, который колеблется от 0 градусов до максимум 200 градусов, а затем снова возвращается. Проблема в том, что если маятник поворачивается на 180 градусов, он возвращается к 0 по кратчайшему маршруту, который должен продолжаться по часовой стрелке. И я бы хотел, чтобы это пошло против часовой стрелки. Вот мой код: ('right' - логическое значение, которое ИСТИНА, когда маятник качается слева направо)

 - (void)swingPendulum {
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    if (right) 
        rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMax)];
    else
        rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];                               
    rotationAnimation.duration = 1.0;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.delegate = self;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    rotationAnimation.removedOnCompletion = NO;

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

Есть идеи, как я могу заставить это работать? Это последняя часть моей головоломки на свингометре, которая отлично работает: D Спасибо!

Michael

Ответы [ 4 ]

8 голосов
/ 20 сентября 2010

Чтобы заставить его двигаться против часовой стрелки, просто установите x в отрицательное значение (добавьте вперед) где ты хочешь

rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(x)];
2 голосов
/ 12 августа 2010

Попробуйте установить что-то вроде

rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];

Используя функции преобразования значений, анимации могут влиять на свойство преобразования слоя, используя произвольные преобразования каждого компонента (без нормализации до 360 °), и объединяться в обычном режиме при одновременном применении нескольких анимаций.

Вы используете функцию преобразования значения, которая поворачивается от 0 ° до 180 ° вокруг оси z, создав функцию CAValueTransform, указав kCAValueFunctionRotateZ, а затем создав анимацию с fromValue 0, toValue M_PI и установив анимацию Свойство valueTransform к экземпляру преобразования значения.

1 голос
/ 17 января 2013

Я думаю, вы должны использовать этот код:

[rotationAnimation.byValue = [NSNumber numberWithFloat:degreesToRadians(kMax/2))];
[rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];
0 голосов
/ 12 августа 2010

Я не совсем уверен, в чем проблема, но если вы используете функцию автореверса анимации, вы, вероятно, можете упростить это и заставить его вращаться (качаться) назад и вперед. Это работает для меня:

CABasicAnimation* rotationAnimation = 
          [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
[rotationAnimation setToValue:[NSNumber numberWithFloat:DegreesToRadians(200.0)]];
[rotationAnimation setDuration:1.0];
[rotationAnimation setRepeatCount:HUGE_VALF]; // Repeat forever
[rotationAnimation setAutoreverses:YES]; // Return to starting point

[[pendulum layer] addAnimation:rotationAnimation forKey:nil];
...