вращать UIView вокруг его центра, но несколько раз - PullRequest
16 голосов
/ 06 февраля 2009

Я пытаюсь повернуть немного UIView вокруг его центра, поэтому простой код выглядит примерно так: (в псевдокоде):

[UIView beginAnimations:@"crazyRotate" context:nil];
[UIView setAnimationDuration:1.0];
someview.transform = CGAffineTransformMakeRotation(angle);
[UIView commitAnimations]

Теперь, если я установлю угол, чтобы сказать M_PI / 2, вещь вращается хорошо. если я установлю его на 2 * M_PI, то он ничего не делает. Я могу понять, что матрица переводится во что-то, что ничего не делает (вращение на 360 означает «остаться» в некотором смысле), тем не менее, я хочу повернуть его 5 раз (представьте, что эффект поворота газеты на вас влияет - я не очень хорош в описании, надеюсь, кто-то понимает). Итак, я попытался добавить угол установки до 180 градусов (M_PI) и добавить вложенный animatationBlock. но я думаю, что, поскольку я снова устанавливаю то же свойство (someview.transition), оно как-то игнорируется). Я попытался установить счетчик повторений анимации равным 2 с углом M_PI, но, похоже, он просто поворачивается на 180, возвращается в прямое положение и затем снова запускает вращение.

Итак, у меня мало идей, любая помощь приветствуется! --t

Ответы [ 4 ]

36 голосов
/ 06 февраля 2009

Вы можете использовать следующую анимацию в свойстве layer вашего UIView. Я проверял это.

UIView *viewToSpin = ...;    
CABasicAnimation* spinAnimation = [CABasicAnimation
                                  animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI];
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
6 голосов
/ 29 февраля 2012

Как указал Брэд Ларсон, вы можете сделать это с помощью CAKeyframeAnimation. Например,

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

rotationAnimation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0 * M_PI], 
                            [NSNumber numberWithFloat:0.75 * M_PI], 
                            [NSNumber numberWithFloat:1.5 * M_PI], 
                            [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
rotationAnimation.timingFunction = 
   [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
rotationAnimation.duration = 10.0;

CALayer *layer = [viewToSpin layer];
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

Вы можете контролировать продолжительность всей анимации с помощью свойства rotationAnimation.duration, а ускорение и замедление (и вычисление промежуточных шагов) с помощью свойства rotationAnimation.timingFunction.

1 голос
/ 22 июня 2015
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 8.0f;
animation.repeatCount = INFINITY;
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"];
1 голос
/ 06 февраля 2009

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

Возможно, CAKeyframeAnimation, созданная с этими значениями половинного поворота, будет правильным решением. Тогда вы также можете контролировать ускорение и замедление.

...