Вращать UIView вокруг его центра, но несколько раз

Я пытаюсь повернуть некоторые 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 ответа

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

UIView *viewToSpin = ...;    
CABasicAnimation* spinAnimation = [CABasicAnimation
                                  animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI];
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"];

Как указал Брэд Ларсон, вы можете сделать это с 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 имущество.

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"];

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

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

Другие вопросы по тегам