CATransform3DRotate вращаться на 360 градусов


Я начал использовать CATransform3D в последнее время, и это кажется очень приятным. У меня просто есть 1 проблема с ротацией, хотя. Я пытаюсь повернуть свой взгляд на 360 градусов вправо, но если я просто положу pass 360 в CATransform3DRotate, это не сработает (он просто не двигается вообще.)

Вот мой код:

      CALayer *layer = dock.layer;
      CATransform3D r = CATransform3DIdentity;
      r.m34 = 1.0 / -500;
      r = CATransform3DRotate(r, DegreesToRadians(360.0f), 100.0f, 1.0f, 100.0f);   
      layer.transform = r;

Кто-нибудь знает, как исправить эту проблему? Заранее спасибо! :)

1 6

1 ответ:

Вы можете анимировать слой через один (или несколько) полных оборотов вокруг его оси Z, анимируя путь ключа слоя transform.rotation, например:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.duration = .25;
animation.fromValue = [NSNumber numberWithFloat:0];
animation.toValue = [NSNumber numberWithFloat:2 * M_PI];
[layer addAnimation:animation forKey:animation.keyPath];

Вы можете анимировать вокруг осей X или Y, используя ключевые пути transform.rotation.x и transform.rotation.y. (Путь ключа transform.rotation.z имеет тот же эффект, что и путь ключа transform.rotation.) Вы можете применить несколько вращений, на отдельных осях, одновременно.

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

CALayer *layer = [sender layer];
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0 / -50;
layer.transform = transform;

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
animation.values = [NSArray arrayWithObjects:
    [NSValue valueWithCATransform3D:CATransform3DRotate(transform, 0 * M_PI / 2, 100, 1, 100)],
    [NSValue valueWithCATransform3D:CATransform3DRotate(transform, 1 * M_PI / 2, 100, 1, 100)],
    [NSValue valueWithCATransform3D:CATransform3DRotate(transform, 2 * M_PI / 2, 100, 1, 100)],
    [NSValue valueWithCATransform3D:CATransform3DRotate(transform, 3 * M_PI / 2, 100, 1, 100)],
    [NSValue valueWithCATransform3D:CATransform3DRotate(transform, 4 * M_PI / 2, 100, 1, 100)],
    nil];
animation.duration = 2;
[layer addAnimation:animation forKey:animation.keyPath];