UIView бесконечная анимация вращения на 360 градусов?
Я пытаюсь повернуть a UIImageView
360 градусов, и посмотрел на некоторые учебники онлайн. Я не мог заставить ни одного из них работать, без UIView
либо остановка, либо переход в новое положение.
- как я могу этого достичь?
последнее, что я пробовал:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
но если я использую 2 * pi, он не движется вообще (так как это то же самое положение). Если я попытаюсь сделать только pi (180 градусов), это сработает, но если я снова вызову метод, он вращается назад.
EDIT:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
[UIView setAnimationRepeatCount:HUGE_VALF];
[UIView setAnimationBeginsFromCurrentState:YES];
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
не работает. Он идет в 180
градусов, делает паузу на долю секунды, а затем сбрасывает обратно в 0
градусов, прежде чем снова начинается.
26 ответов:
нашел метод (я немного изменил его), который отлично работал для меня: вращение iphone UIImageView
#import <QuartzCore/QuartzCore.h> - (void) runSpinAnimationOnView:(UIView*)view duration:(CGFloat)duration rotations:(CGFloat)rotations repeat:(float)repeat { CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; rotationAnimation.duration = duration; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = repeat ? HUGE_VALF : 0; [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; }
Слава Ричарду Дж. Россу III за эту идею, но я обнаружил, что его код не совсем то, что мне нужно. Значение по умолчанию для
options
, Я полагаю, чтобы дать вамUIViewAnimationOptionCurveEaseInOut
, что не выглядит правильно в непрерывной анимации. Кроме того, я добавил чек, чтобы я мог остановить свою анимацию на четном четверть оборота, если мне нужно (не бесконечный, а бессрочный длительность), и сделал ускорение нарастать в течение первых 90 градусов, и замедлить в течение последних 90 градусов (после того, как остановка была запрошена):// an ivar for your class: BOOL animating; - (void)spinWithOptions:(UIViewAnimationOptions)options { // this spin completes 360 degrees every 2 seconds [UIView animateWithDuration:0.5 delay:0 options:options animations:^{ self.imageToMove.transform = CGAffineTransformRotate(imageToMove.transform, M_PI / 2); } completion:^(BOOL finished) { if (finished) { if (animating) { // if flag still set, keep spinning with constant speed [self spinWithOptions: UIViewAnimationOptionCurveLinear]; } else if (options != UIViewAnimationOptionCurveEaseOut) { // one last spin, with deceleration [self spinWithOptions: UIViewAnimationOptionCurveEaseOut]; } } }]; } - (void)startSpin { if (!animating) { animating = YES; [self spinWithOptions: UIViewAnimationOptionCurveEaseIn]; } } - (void)stopSpin { // set the flag to stop spinning after one last 90 degree increment animating = NO; }
обновление
Я добавил возможность обрабатывать запросы, чтобы начать вращаться снова (
startSpin
), в то время как предыдущий спин идет на спад (завершение). Пример проекта здесь, на Github.
ответ Нейта выше идеально подходит для остановки и запуска анимации и дает лучший контроль. Я был заинтригован, почему твой не работает, а его работает. Я хотел поделиться своими выводами здесь и более простой версией кода, который будет постоянно анимировать UIView без остановки.
это код, который я использовал,
- (void)rotateImageView { [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ [self.imageView setTransform:CGAffineTransformRotate(self.imageView.transform, M_PI_2)]; }completion:^(BOOL finished){ if (finished) { [self rotateImageView]; } }]; }
я использовал 'CGAffineTransformRotate' вместо 'CGAffineTransformMakeRotation', потому что первый возвращает результат, который сохраняется как анимация вырученные деньги. Это предотвратит переход или сброс вида во время анимации.
другое дело не использовать 'UIViewAnimationOptionRepeat', потому что в конце анимации, прежде чем она начнет повторяться, он сбрасывает преобразование, заставляя представление вернуться в исходное положение. Вместо повтора выполняется рекурсия, чтобы преобразование никогда не сбрасывалось в исходное значение, поскольку блок анимации практически никогда не заканчивается.
и последнее, что вам нужно преобразуйте вид с шагом 90 градусов (M_PI / 2) вместо 360 или 180 градусов (2*M_PI или M_PI). Потому что преобразование происходит как матричное умножение значений синуса и Косинуса.
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t
Итак, скажем, если вы используете 180-градусное преобразование, Косинус 180 дает -1, заставляя вид преобразовываться в противоположном направлении каждый раз (Примечание-ответ Нейта также будет иметь эту проблему, если вы измените значение Радиана преобразования на M_PI). 360-градусное преобразование просто просит смотрите, чтобы остаться там, где он был, поэтому вы не видите никакого вращения вообще.
в Swift, вы можете использовать следующий код для бесконечного вращения:
Swift 4
extension UIView { private static let kRotationAnimationKey = "rotationanimationkey" func rotate(duration: Double = 1) { if layer.animation(forKey: UIView.kRotationAnimationKey) == nil { let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") rotationAnimation.fromValue = 0.0 rotationAnimation.toValue = Float.pi * 2.0 rotationAnimation.duration = duration rotationAnimation.repeatCount = Float.infinity layer.add(rotationAnimation, forKey: UIView.kRotationAnimationKey) } } func stopRotating() { if layer.animation(forKey: UIView.kRotationAnimationKey) != nil { layer.removeAnimation(forKey: UIView.kRotationAnimationKey) } } }
Swift 3
let kRotationAnimationKey = "com.myapplication.rotationanimationkey" // Any key func rotateView(view: UIView, duration: Double = 1) { if view.layer.animationForKey(kRotationAnimationKey) == nil { let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") rotationAnimation.fromValue = 0.0 rotationAnimation.toValue = Float(M_PI * 2.0) rotationAnimation.duration = duration rotationAnimation.repeatCount = Float.infinity view.layer.addAnimation(rotationAnimation, forKey: kRotationAnimationKey) } }
остановка как:
func stopRotatingView(view: UIView) { if view.layer.animationForKey(kRotationAnimationKey) != nil { view.layer.removeAnimationForKey(kRotationAnimationKey) } }
если все, что вы хотите сделать, это бесконечно вращать изображение, это работает довольно хорошо, и очень просто:
NSTimeInterval duration = 10.0f; CGFloat angle = M_PI / 2.0f; CGAffineTransform rotateTransform = CGAffineTransformRotate(imageView.transform, angle); [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionRepeat| UIViewAnimationOptionCurveLinear animations:^{ imageView.transform = rotateTransform; } completion:nil];
по моему опыту, это работает безупречно, но убедитесь, что ваше изображение способно вращаться вокруг своего центра без каких-либо смещений, или анимация изображения будет "прыгать", как только она сделает это вокруг PI.
чтобы изменить направление вращения, меняют знак
angle
(angle *= -1
).обновление комментарии @AlexPretzlav сделал я вернулся к этому, и я понял, что когда я писал это изображение, которое я вращал, было отражено как по вертикальной, так и по горизонтальной оси, то есть изображение действительно вращалось только на 90 градусов, а затем сбрасывалось, хотя это посмотрел как будто он продолжал вращаться вокруг своей оси.
Итак, если ваше изображение похоже на мое, это будет отлично работать, однако, если изображение не симметрично, вы заметите "привязку" к исходной ориентации после 90 степени.
чтобы повернуть несимметричное изображение, вам лучше с принятым ответом.
одно из этих менее элегантных решений, рассмотренных ниже, действительно повернет изображение, но при перезапуске анимации может возникнуть заметное заикание:
- (void)spin { NSTimeInterval duration = 0.5f; CGFloat angle = M_PI_2; CGAffineTransform rotateTransform = CGAffineTransformRotate(self.imageView.transform, angle); [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ self.imageView.transform = rotateTransform; } completion:^(BOOL finished) { [self spin]; }]; }
вы также можете сделать это только с блоками, как предлагает @richard-j-ross-iii, но вы получите предупреждение о цикле сохранения, так как блок захватывает себя:
__block void(^spin)() = ^{ NSTimeInterval duration = 0.5f; CGFloat angle = M_PI_2; CGAffineTransform rotateTransform = CGAffineTransformRotate(self.imageView.transform, angle); [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ self.imageView.transform = rotateTransform; } completion:^(BOOL finished) { spin(); }]; }; spin();
мой вклад с быстрым расширением из проверенного решения:
Swift 4.0
extension UIView{ func rotate() { let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.toValue = NSNumber(value: Double.pi * 2) rotation.duration = 1 rotation.isCumulative = true rotation.repeatCount = Float.greatestFiniteMagnitude self.layer.add(rotation, forKey: "rotationAnimation") } }
удалено :
extension UIView{ func rotate() { let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.toValue = NSNumber(double: M_PI * 2) rotation.duration = 1 rotation.cumulative = true rotation.repeatCount = FLT_MAX self.layer.addAnimation(rotation, forKey: "rotationAnimation") } }
используйте четверть оборота и увеличивайте поворот постепенно.
void (^block)() = ^{ imageToMove.transform = CGAffineTransformRotate(imageToMove.transform, M_PI / 2); } void (^completion)(BOOL) = ^(BOOL finished){ [UIView animateWithDuration:1.0 delay:0.0 options:0 animations:block completion:completion]; } completion(YES);
Я нашел хороший код в этом хранилище,
вот код из него я сделал небольшие изменения в соответствии с моей потребностью в скорости:)
UIImageView + Поворот.h
#import <Foundation/Foundation.h> @interface UIImageView (Rotate) - (void)rotate360WithDuration:(CGFloat)duration repeatCount:(float)repeatCount; - (void)pauseAnimations; - (void)resumeAnimations; - (void)stopAllAnimations; @end
UIImageView + Поворот.м
#import <QuartzCore/QuartzCore.h> #import "UIImageView+Rotate.h" @implementation UIImageView (Rotate) - (void)rotate360WithDuration:(CGFloat)duration repeatCount:(float)repeatCount { CABasicAnimation *fullRotation; fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; fullRotation.fromValue = [NSNumber numberWithFloat:0]; //fullRotation.toValue = [NSNumber numberWithFloat:(2*M_PI)]; fullRotation.toValue = [NSNumber numberWithFloat:-(2*M_PI)]; // added this minus sign as i want to rotate it to anticlockwise fullRotation.duration = duration; fullRotation.speed = 2.0f; // Changed rotation speed if (repeatCount == 0) fullRotation.repeatCount = MAXFLOAT; else fullRotation.repeatCount = repeatCount; [self.layer addAnimation:fullRotation forKey:@"360"]; } //Not using this methods :) - (void)stopAllAnimations { [self.layer removeAllAnimations]; }; - (void)pauseAnimations { [self pauseLayer:self.layer]; } - (void)resumeAnimations { [self resumeLayer:self.layer]; } - (void)pauseLayer:(CALayer *)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; } - (void)resumeLayer:(CALayer *)layer { CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; layer.beginTime = 0.0; CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; layer.beginTime = timeSincePause; } @end
вот мое быстрое решение как расширение UIView. Это можно рассматривать как моделирование поведения UIActivityIndicator на любом UIImageView.
import UIKit extension UIView { /** Starts rotating the view around Z axis. @param duration Duration of one full 360 degrees rotation. One second is default. @param repeatCount How many times the spin should be done. If not provided, the view will spin forever. @param clockwise Direction of the rotation. Default is clockwise (true). */ func startZRotation(duration duration: CFTimeInterval = 1, repeatCount: Float = Float.infinity, clockwise: Bool = true) { if self.layer.animationForKey("transform.rotation.z") != nil { return } let animation = CABasicAnimation(keyPath: "transform.rotation.z") let direction = clockwise ? 1.0 : -1.0 animation.toValue = NSNumber(double: M_PI * 2 * direction) animation.duration = duration animation.cumulative = true animation.repeatCount = repeatCount self.layer.addAnimation(animation, forKey:"transform.rotation.z") } /// Stop rotating the view around Z axis. func stopZRotation() { self.layer.removeAnimationForKey("transform.rotation.z") } }
это работало для меня:
[UIView animateWithDuration:1.0 animations:^ { self.imageView.transform = CGAffineTransformMakeRotation(M_PI); self.imageView.transform = CGAffineTransformMakeRotation(0); }];
версия Swift3:
extension UIView { func startRotate() { let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.fromValue = 0 rotation.toValue = NSNumber(value: M_PI * 2) rotation.duration = 2 rotation.isCumulative = true rotation.repeatCount = FLT_MAX self.layer.add(rotation, forKey: "rotationAnimation") } func stopRotate() { self.layer.removeAnimation(forKey: "rotationAnimation") } }
и не забудьте позвонить
startRotate
inviewWillAppear
не вviewDidLoad
.
Дэвид Rysanek обновлено до Swift 4:
import UIKit extension UIView { func startRotating(duration: CFTimeInterval = 3, repeatCount: Float = Float.infinity, clockwise: Bool = true) { if self.layer.animation(forKey: "transform.rotation.z") != nil { return } let animation = CABasicAnimation(keyPath: "transform.rotation.z") let direction = clockwise ? 1.0 : -1.0 animation.toValue = NSNumber(value: .pi * 2 * direction) animation.duration = duration animation.isCumulative = true animation.repeatCount = repeatCount self.layer.add(animation, forKey:"transform.rotation.z") } func stopRotating() { self.layer.removeAnimation(forKey: "transform.rotation.z") } } }
вы также можете сделать тот же тип анимации с помощью UIView и блоков. Вот метод расширения класса, который можно повернуть на любой угол.
- (void)rotationWithDuration:(NSTimeInterval)duration angle:(CGFloat)angle options:(UIViewAnimationOptions)options { // Repeat a quarter rotation as many times as needed to complete the full rotation CGFloat sign = angle > 0 ? 1 : -1; __block NSUInteger numberRepeats = floorf(fabsf(angle) / M_PI_2); CGFloat quarterDuration = duration * M_PI_2 / fabs(angle); CGFloat lastRotation = angle - sign * numberRepeats * M_PI_2; CGFloat lastDuration = duration - quarterDuration * numberRepeats; __block UIViewAnimationOptions startOptions = UIViewAnimationOptionBeginFromCurrentState; UIViewAnimationOptions endOptions = UIViewAnimationOptionBeginFromCurrentState; if (options & UIViewAnimationOptionCurveEaseIn || options == UIViewAnimationOptionCurveEaseInOut) { startOptions |= UIViewAnimationOptionCurveEaseIn; } else { startOptions |= UIViewAnimationOptionCurveLinear; } if (options & UIViewAnimationOptionCurveEaseOut || options == UIViewAnimationOptionCurveEaseInOut) { endOptions |= UIViewAnimationOptionCurveEaseOut; } else { endOptions |= UIViewAnimationOptionCurveLinear; } void (^lastRotationBlock)(void) = ^ { [UIView animateWithDuration:lastDuration delay:0 options:endOptions animations:^{ self.transform = CGAffineTransformRotate(self.transform, lastRotation); } completion:^(BOOL finished) { NSLog(@"Animation completed"); } ]; }; if (numberRepeats) { __block void (^quarterSpinningBlock)(void) = ^{ [UIView animateWithDuration:quarterDuration delay:0 options:startOptions animations:^{ self.transform = CGAffineTransformRotate(self.transform, M_PI_2); numberRepeats--; } completion:^(BOOL finished) { if (numberRepeats > 0) { startOptions = UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveLinear; quarterSpinningBlock(); } else { lastRotationBlock(); }NSLog(@"Animation completed"); } ]; }; quarterSpinningBlock(); } else { lastRotationBlock(); } }
Если кто-то хотел решение нейтса, но в swift, то вот грубый swift перевод:
class SomeClass: UIViewController { var animating : Bool = false @IBOutlet weak var activityIndicatorImage: UIImageView! func startSpinning() { if(!animating) { animating = true; spinWithOptions(UIViewAnimationOptions.CurveEaseIn); } } func stopSpinning() { animating = false } func spinWithOptions(options: UIViewAnimationOptions) { UIView.animateWithDuration(0.5, delay: 0.0, options: options, animations: { () -> Void in let val : CGFloat = CGFloat((M_PI / Double(2.0))); self.activityIndicatorImage.transform = CGAffineTransformRotate(self.activityIndicatorImage.transform,val) }) { (finished: Bool) -> Void in if(finished) { if(self.animating){ self.spinWithOptions(UIViewAnimationOptions.CurveLinear) } else if (options != UIViewAnimationOptions.CurveEaseOut) { self.spinWithOptions(UIViewAnimationOptions.CurveEaseOut) } } } } override func viewDidLoad() { startSpinning() } }
вот как я вращаю 360 в правильном направлении.
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveLinear animations:^{ [imageIndView setTransform:CGAffineTransformRotate([imageIndView transform], M_PI-0.00001f)]; } completion:nil];
@рам ответ было очень полезно. Вот быстрый вариант ответа.
private func rotateImageView() { UIView.animateWithDuration(1, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { () -> Void in self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, CGFloat(M_PI_2)) }) { (finished) -> Void in if finished { self.rotateImageView() } } }
создать анимацию
- (CABasicAnimation *)spinAnimationWithDuration:(CGFloat)duration clockwise:(BOOL)clockwise repeat:(BOOL)repeats { CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; anim.toValue = clockwise ? @(M_PI * 2.0) : @(M_PI * -2.0); anim.duration = duration; anim.cumulative = YES; anim.repeatCount = repeats ? CGFLOAT_MAX : 0; return anim; }
добавить его в представление, как это
CABasicAnimation *animation = [self spinAnimationWithDuration:1.0 clockwise:YES repeat:YES]; [self.spinningView.layer addAnimation:animation forKey:@"rotationAnimation"];
как этот ответ отличается? У вас будет более чистый код, если большинство ваших функций возвращает объекты вместо того, чтобы просто манипулировать некоторыми объектами здесь и там.
для xamarin ios:
public static void RotateAnimation (this UIView view, float duration=1, float rotations=1, float repeat=int.MaxValue) { var rotationAnimation = CABasicAnimation.FromKeyPath ("transform.rotation.z"); rotationAnimation.To = new NSNumber (Math.PI * 2.0 /* full rotation*/ * 1 * 1); rotationAnimation.Duration = 1; rotationAnimation.Cumulative = true; rotationAnimation.RepeatCount = int.MaxValue; rotationAnimation.RemovedOnCompletion = false; view.Layer.AddAnimation (rotationAnimation, "rotationAnimation"); }
есть следующие различные способы выполнения 360 градусов анимации с UIView.
используя CABasicAnimation
var rotationAnimation = CABasicAnimation() rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z") rotationAnimation.toValue = NSNumber(value: (Double.pi)) rotationAnimation.duration = 1.0 rotationAnimation.isCumulative = true rotationAnimation.repeatCount = 100.0 view.layer.add(rotationAnimation, forKey: "rotationAnimation")
Вот функции расширения для UIView, которые обрабатывают операции запуска и остановки вращения:extension UIView { // Start rotation func startRotation() { let rotation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.fromValue = 0 rotation.toValue = NSNumber(value: Double.pi) rotation.duration = 1.0 rotation.isCumulative = true rotation.repeatCount = FLT_MAX self.layer.add(rotation, forKey: "rotationAnimation") } // Stop rotation func stopRotation() { self.layer.removeAnimation(forKey: "rotationAnimation") } }
Теперь, используя, UIView.анимация закрытие:UIView.animate(withDuration: 0.5, animations: { view.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi)) }) { (isAnimationComplete) in // Animation completed }
Я разработал блестящую анимационную структуру, которая может сэкономить вам тон времени! С его помощью эта анимация может быть создана очень легко:
private var endlessRotater: EndlessAnimator! override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) let rotationAnimation = AdditiveRotateAnimator(M_PI).to(targetView).duration(2.0).baseAnimation(.CurveLinear) endlessRotater = EndlessAnimator(rotationAnimation) endlessRotater.animate() }
чтобы остановить эту анимацию просто набор
nil
toendlessRotater
.Если вы заинтересованы, пожалуйста, посмотрите:https://github.com/hip4yes/Animatics
Swift 4,
func rotateImage(image: UIImageView) { UIView.animate(withDuration: 1, animations: { image.transform = CGAffineTransform(rotationAngle: CGFloat.pi) image.transform = CGAffineTransform.identity }) { (completed) in self.rotateImage() } }
Swift 4.0
func rotateImageView() { UIView.animate(withDuration: 0.3, delay: 0, options: .curveLinear, animations: {() -> Void in self.imageView.transform = self.imageView.transform.rotated(by: .pi / 2) }, completion: {(_ finished: Bool) -> Void in if finished { rotateImageView() } }) }
Swift:
func runSpinAnimationOnView(view:UIView , duration:Float, rotations:Double, repeatt:Float ) ->() { let rotationAnimation=CABasicAnimation(); rotationAnimation.keyPath="transform.rotation.z" let toValue = M_PI * 2.0 * rotations ; // passing it a float let someInterval = CFTimeInterval(duration) rotationAnimation.toValue=toValue; rotationAnimation.duration=someInterval; rotationAnimation.cumulative=true; rotationAnimation.repeatCount=repeatt; view.layer.addAnimation(rotationAnimation, forKey: "rotationAnimation") }
Swift 3:
var rotationAnimation = CABasicAnimation() rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z") rotationAnimation.toValue = NSNumber(value: (M_PI * 2.0)) rotationAnimation.duration = 2.0 rotationAnimation.isCumulative = true rotationAnimation.repeatCount = 10.0 view.layer.add(rotationAnimation, forKey: "rotationAnimation")
let val = CGFloat(M_PI_2) UIView.animate(withDuration: 1, delay: 0, options: [.repeat, .curveLinear], animations: { self.viewToRotate.transform = self.viewToRotate.transform.rotated(by: val) })
Я думаю, вам лучше добавить
UIVIew
категория:#import <QuartzCore/QuartzCore.h> #import "UIView+Rotate.h"
Реализация UIView (Поворот)
(void)remrotate360WithDuration:(CGFloat)duration repeatCount: (float)repeatCount { CABasicAnimation *fullRotation; fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; fullRotation.fromValue = [NSNumber numberWithFloat:0]; fullRotation.toValue = [NSNumber numberWithFloat:(2*M_PI)]; // fullRotation.toValue = [NSNumber numberWithFloat:-(2*M_PI)]; // added this minus sign as i want to rotate it to anticlockwise fullRotation.duration = duration; fullRotation.speed = 2.0f; // Changed rotation speed if (repeatCount == 0) fullRotation.repeatCount = MAXFLOAT; else fullRotation.repeatCount = repeatCount; [self.layer addAnimation:fullRotation forKey:@"360"]; }
не используя эти методы :)
(void)remstopAllAnimations { [self.layer removeAllAnimations]; };
(void)rempauseAnimations { [self rempauseLayer:self.layer]; }
(void)remresumeAnimations { [self remresumeLayer:self.layer]; }
(void)rempauseLayer:(CALayer *)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; }
(void)remresumeLayer:(CALayer *)layer { CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; layer.beginTime = 0.0; CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; layer.beginTime = timeSincePause; }