Принудительное вращение по часовой стрелке / против часовой стрелки для CABasicAnimation для UIImageView

Я анимирую маятник, который поворачивается от 0 градусов до максимум 200 градусов, а затем снова возвращается. Проблема в том, что если маятник поворачивается на 180 градусов, он возвращается к 0 по кратчайшему маршруту, который должен продолжаться по часовой стрелке. И я бы хотел, чтобы это было против часовой стрелки. Вот мой код: анимация маятника, который колеблется от 0 градусов до максимум 200 градусов, а затем снова возвращается. Проблема в том, что если маятник поворачивается на 180 градусов, он возвращается к 0 по кратчайшему пути, который ...

Я анимирую маятник, который поворачивается от 0 градусов до максимум 200 градусов, а затем снова возвращается. Проблема в том, что если маятник поворачивается на 180 градусов, он возвращается к 0 по кратчайшему маршруту, который должен продолжаться по часовой стрелке. И я бы хотел, чтобы это было против часовой стрелки. Вот мой код: анимация маятника, который колеблется от 0 градусов до максимум 200 градусов, а затем снова возвращается. Проблема в том, что если маятник поворачивается на 180 градусов, он возвращается к 0 по кратчайшему пути, который ...

Я анимирую маятник, который поворачивается от 0 градусов до максимум 200 градусов, а затем снова возвращается. Проблема в том, что если маятник поворачивается на 180 градусов, он возвращается к 0 по кратчайшему маршруту, который должен продолжаться по часовой стрелке. И я бы хотел, чтобы это было против часовой стрелки. Вот мой код: он возвращается к 0 по кратчайшему маршруту, который должен продолжаться по часовой стрелке. И я бы хотел, чтобы это было против часовой стрелки. Вот мой код: он возвращается к 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 Спасибо!

Майкл

8
задан Smikey 20 September 2010 в 11:30
поделиться

2 ответа

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

rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];

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

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

2
ответ дан 5 December 2019 в 15:17
поделиться

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

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];
0
ответ дан 5 December 2019 в 15:17
поделиться