Как сделать полный поворот кругового объекта с помощью анимации uiview

Я пытаюсь перебрать частичные круги, чтобы добиться анимации, но она поворачивается только на 180 градусов, а затем снова начинается с 0 градусов до 180 градусов. Так что есть резкий скачок от 180 градусов до 360 градусов. Как сделать так, чтобы объект кругового изображения вращался непрерывно без каких-либо скачков? Вот мой текущий код:

    UIViewAnimationOptions options = UIViewAnimationOptionCurveLinear|UIViewAnimationOptionRepeat;

    [UIView animateWithDuration:ROTATE_ANIMATION_DURATION/2 delay:0 options:options 
       animations:^{
           view.transform = CGAffineTransformRotate(transform, M_PI);}//1st step of animation finished
       completion:^(BOOL finished) {
             [UIView animateWithDuration:ROTATE_ANIMATION_DURATION/2 delay:0 options:options 
                animations:^{
                    view.transform = CGAffineTransformRotate(transform, M_PI);} //2nd step of animation finished
                completion:^(BOOL finished) {nil;
                }];

4 ответа

Spin UI Object, анимация вращения на 360 градусов
вам нужно будет добавить QuartzCore Framework в ваш проект и включить

#import QuartzCore/QuartzCore.h

Добавить анимацию для объекта:

 CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    fullRotation.fromValue = [NSNumber numberWithFloat:0];
    fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
    fullRotation.duration = 6;
    fullRotation.repeatCount = 1e100f;
    [myview.layer addAnimation:fullRotation forKey:@"360"];

Я нашел какой-то старый код, который использую для поворота вида на 360 градусов, надеюсь, это поможет. Вам нужно будет импортировать QuartzCore.

CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.zRad"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0];

rotationAnimation.duration = 3;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = INFINITY;
rotationAnimation.timingFunction = 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

[viewToAnimate.layer addAnimation:rotationAnimation forKey:@"transform.rotation.zRad"];

Существуют следующие способы выполнения 360-градусной анимации с помощью UIView.

Использование CABasicAnimation

var rotationAnimation = CABasicAnimation()
rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(value: (Double.pi * 2.0))
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 * 2)
        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.animation:

UIView.animate(withDuration: 0.5, animations: { 
      view.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi)) 
}) { (isAnimationComplete) in
    UIView.animate(withDuration: 0.5) { 
      view.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi))
    }
}
BOOL animating;

- (void)spinWithOptions:(UIViewAnimationOptions)options {  
[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) {
                                 [self spinWithOptions: UIViewAnimationOptionCurveLinear];
                              } else if (options != UIViewAnimationOptionCurveEaseOut) {
                                 [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 и stopSpin соответственно.

И вот быстрый ответ:

func spin(with options: UIViewAnimationOptions) {
             UIView.animate(withDuration: 0.5, delay: 0, options: options,
        animations: {() -> Void in

                    self.imageToRotate.transform = self.imageToRotate.transform.rotated(by: .pi / 2)  
                }, completion: {(_ finished: Bool) -> Void in

            if finished {
               if self.animating {
                  self.spin(with: .curveLinear)
               }
               else if options != .curveEaseOut {
                  self.spin(with: .curveEaseOut)
               }
            }
        })
}

func startSpin() {
   if !animating {
      animating = true
      spin(with: .curveEaseIn)
   }
}

func stopSpin() {
    animating = false
}
Другие вопросы по тегам