2015-03-10 4 views
0

Вот мой код. Цель состоит в том, чтобы непрерывно вращать UIImageView с именем swirls [l]. Однако между каждым началом/окончанием вращения существует небольшая пауза. Я прошел через каждый учебник по анимации, но не могу понять, что это за ошибка?Быстрое непрерывное вращение Анимация не такая непрерывная

let fullRotation = CGFloat(M_PI * 2) 

    let duration = 2.0 
    let delay = 0.0 
    let options = UIViewKeyframeAnimationOptions.Repeat | UIViewKeyframeAnimationOptions.CalculationModeLinear 

    UIView.animateKeyframesWithDuration(duration, delay: delay, options: options, animations: { 
     UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 1/3, animations: { 
      swirls[l].transform = CGAffineTransformMakeRotation(1/3 * fullRotation) 
     }) 
     UIView.addKeyframeWithRelativeStartTime(1/3, relativeDuration: 1/3, animations: { 
      swirls[l].transform = CGAffineTransformMakeRotation(2/3 * fullRotation) 
     }) 
     UIView.addKeyframeWithRelativeStartTime(2/3, relativeDuration: 1/3, animations: { 
      swirls[l].transform = CGAffineTransformMakeRotation(3/3 * fullRotation) 
     }) 

     }, completion: {finished in 
    }) 

EDIT: Я вижу, что это было предложено, что предыдущее решение доступно, но она просто не работает для непрерывного непрерывного вращения. Единственный трюк, который работал для меня, - это тот ответ, который я выбрал ниже. Благодаря

+0

Возможный дубликат [Создайте непрерывно вращающийся квадрат на экране с помощью animateKeyframesWithDuration] (http://stackoverflow.com/questions/26665124/create-a-continuously-rotating-square-on-the-screen-using-animatekeyframeswithdu) –

ответ

12

Я не уверен, что случилось с вашим кодом, но я реализовал непрерывное вращение с помощью этого метода,

@IBAction func rotateView(sender: UIButton) { 

     UIView.animateWithDuration(0.5, delay: 0, options: .CurveLinear, animations: {() -> Void in 
      self.spinningView.transform = CGAffineTransformRotate(self.spinningView.transform, CGFloat(M_PI_2)) 
     }) { (finished) -> Void in 
      self.rotateView(sender) 
     } 
    } 
+2

Я думаю, что было бы лучше использовать UIViewAnimationOptions.Repeat, а не запускать анимацию снова в обработчике завершения –

+0

@zellb, который не работает в этой ситуации, так как я только иду по 1/4 пути вокруг каждого вызова. Кроме того, это то, что делает OP, и это приводит к задержке до начала следующей анимации. – rdelmar

+0

@rdelmar: Я пробовал это, но у меня нет вращения вообще. – Kashif

3

Если вы хотите непрерывную кнопку поворота или просмотр и остановить это вращение всякий раз, когда вы хотите то вы можете попробовать это: для вращения пуска:

@IBOutlet weak var RotateBtn: UIButton! 
var timeTimer: Timer? 

viewDidLoad() 
{ 
    self.rotateView() 
    timeTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.rotateView), userInfo: nil, repeats: true) 
} 

func rotateView() 
{ 
    UIView.animate(withDuration: 0.5, delay: 0, options: .curveLinear, animations: {() -> Void in 
     self.RotateBtn.transform = self.RotateBtn.transform.rotated(by: CGFloat(M_PI_4)) 
    }) 
} 

Если вы хотите, чтобы остановить вращение, то вы можете использовать это:

@IBAction func StopBtn_Pressed(_ sender: AnyObject) 
{ 
    timeTimer?.invalidate() 
    self.RecordBtn.layer.removeAllAnimations() 
} 
17

Попробуйте ниже расширения для быстрой 4.

extension UIView { 
    func rotate360Degrees(duration: CFTimeInterval = 3) { 
     let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
     rotateAnimation.fromValue = 0.0 
     rotateAnimation.toValue = CGFloat(Double.pi * 2) 
     rotateAnimation.isRemovedOnCompletion = false 
     rotateAnimation.duration = duration 
     rotateAnimation.repeatCount=Float.infinity 
     self.layer.add(rotateAnimation, forKey: nil) 
    } 
} 

Для вращения пуска.

MyView.rotate360Degrees() 

И для остановки.

MyView.layer.removeAllAnimations() 

Вы можете использовать UIButton, UILabel и многое другое.

+0

Мне это нравится! Честно говоря, это должен быть правильный ответ. – CodyMace

Смежные вопросы