повернуть 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


person Community    schedule 05.02.2009    source источник
comment
вы также можете начать здесь: github.com/jonasschnelli/UIView-i7Rotate360 очень легко реализовать и изменять.   -  person Jonas Schnelli    schedule 01.12.2010
comment
возможный дубликат анимации вращения UIView Infinite на 360 градусов?   -  person Stephen J    schedule 22.06.2015


Ответы (3)


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

Цель-C

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

Swift 5.0

let viewToSpin = UIView() // However you have initialized your view
let spinAnimation = CABasicAnimation.init(keyPath: "transform.rotation")
spinAnimation.toValue = NSNumber(value: 5.0 * 2.0 * Float.pi)
viewToSpin.layer.add(spinAnimation, forKey: "spinAnimation")
person Jason Medeiros    schedule 06.02.2009
comment
Как мне замедлить эту анимацию? - person mahboudz; 03.08.2009
comment
Чтобы узнать о времени анимации, обратитесь к справочному материалу по протоколу CAMediaTiming, который реализует CABasicAnimation. В частности, вы, вероятно, захотите установить свойство «продолжительность». В приведенном выше коде используется продолжительность по умолчанию 0,25 секунды. - person Jason Medeiros; 06.08.2009

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

person Jeff Hay    schedule 28.02.2012

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

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

person Brad Larson    schedule 06.02.2009