Как я могу обеспечить конкретное направление (то есть по часовой стрелке) вращения в Core Animation? - PullRequest
9 голосов
/ 19 июля 2009

Я вращаю вид с помощью этого:

CGAffineTransform rotatedTransform = CGAffineTransformRotate(CGAffineTransformIdentity, rotationValue);

У меня есть объект, который я хочу вращать примерно на 320 градусов. Теперь Core Animation умна и просто поворачивает ее столько, сколько нужно, делая это, поворачивая ее на -40 градусов. Таким образом, объект вращается в обратном направлении с меньшим количеством движения.

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

Ответы [ 2 ]

18 голосов
/ 19 июля 2009

Следующий фрагмент поворачивает представление с именем someView с использованием анимации по ключевым кадрам. Анимация состоит из 3 кадров, распределенных в течение 1 секунды, при этом изображение поворачивается на 0, 180 и 360 в первом, втором и последнем кадрах соответственно. Код следует:

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

animation.duration = 1.0;
animation.cumulative = YES;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

animation.values = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.0 * M_PI],
    [NSNumber numberWithFloat:0.5 * M_PI],
    [NSNumber numberWithFloat:1.0 * M_PI], nil];

animation.keyTimes = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.0],
    [NSNumber numberWithFloat:0.5],
    [NSNumber numberWithFloat:1.0], nil];

animation.timingFunctions = [NSArray arrayWithObjects:
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], nil];

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

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

CALayer* layer = someView.layer;
CABasicAnimation* animation;
animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

animation.fromValue = [NSNumber numberWithFloat:0.0 * M_PI];
animation.toValue = [NSNumber numberWithFloat:1.0 * M_PI];

animation.duration = 1.0;
animation.cumulative = YES;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

[layer addAnimation:rotationAnimation forKey:@"transform.rotation.z"];
1 голос
/ 19 июля 2009

Я считаю, что вы должны дать ему еще один «ключевой кадр», если хотите дать Core Animation намек на то, что ему нужно идти в этом направлении.

Убедитесь, что отключите замедление (по крайней мере, для конца / начала среднего шага), иначе анимация не будет выглядеть гладкой.

...