Подтвердить что ты не робот

Вращать 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

4b9b3361

Ответ 1

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

Objective-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")

Ответ 2

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

Ответ 3

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

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

Ответ 4

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