Вращать 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
Ответы
Ответ 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"];