Поверните UIButton на 360 градусов

Я пытался запустить анимацию, которая поворачивает мой UIButton 360 градусов, используя этот код:

UIView.animateWithDuration(3.0, animations: {
  self.vineTimeCapButton.transform = CGAffineTransformMakeRotation(CGFloat(M_PI*2))
  self.instagramTimeCapButton.transform = CGAffineTransformMakeRotation(CGFloat(M_PI*2))
})

Тем не менее, он не поворачивается на 360 градусов, потому что UIButton уже находится в этом месте.

Как я могу повернуть свою UIButton на 360 градусов?

Ответ 1

Вы можете использовать хитрость: сначала начните вращаться на 180 градусов, а затем вращайтесь на 360 градусов. Используйте 2 анимации с задержкой. Попробуй это.

Swift 2

UIView.animateWithDuration(0.5) { () -> Void in
  button.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
}

UIView.animateWithDuration(0.5, delay: 0.45, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in      
  button.transform = CGAffineTransformMakeRotation(CGFloat(M_PI * 2))
}, completion: nil)

Swift 3, 4, 5

UIView.animate(withDuration: 0.5) { () -> Void in
  self.settingsButton.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
}

UIView.animate(withDuration: 0.5, delay: 0.45, options: UIViewAnimationOptions.curveEaseIn, animations: { () -> Void in
  self.settingsButton.transform = CGAffineTransform(rotationAngle: CGFloat.pi * 2.0)
}, completion: nil)

Надеюсь, это поможет

Ответ 2

Как обсуждалось здесь, вы можете также использовать CAAnimation. Этот код применяет одно полное вращение на 360:

Свифт 3

let fullRotation = CABasicAnimation(keyPath: "transform.rotation")
fullRotation.delegate = self
fullRotation.fromValue = NSNumber(floatLiteral: 0)
fullRotation.toValue = NSNumber(floatLiteral: Double(CGFloat.pi * 2))
fullRotation.duration = 0.5
fullRotation.repeatCount = 1
button.layer.add(fullRotation, forKey: "360")

Вам нужно будет импортировать QuartzCore:

import QuartzCore

И ваш ViewController должен соответствовать CAAnimationDelegate:

class ViewController: UIViewController, CAAnimationDelegate {

}

Ответ 3

в Swift 3:

UIView.animate(withDuration:0.5, animations: { () -> Void in
  button.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI))
})

UIView.animate(withDuration: 0.5, delay: 0.45, options: .curveEaseIn, animations: { () -> Void in
  button.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI * 2))
}, completion: nil)

Ответ 4

Swift 4. Анимация вложенного закрытия лучше, чем блокирование задержки анимации.

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

       // Nested Block
UIView.animate(withDuration: 0.5) { 
   button.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi * 2)))
       }    
}

Ответ 5

Вы можете использовать небольшое расширение на основе CABasicAnimation (Swift 4.x):

extension UIButton {
    func rotate360Degrees(duration: CFTimeInterval = 1.0, completionDelegate: AnyObject? = nil) {
        let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
        rotateAnimation.fromValue = 0.0
        rotateAnimation.toValue = CGFloat(.pi * 2.0)
        rotateAnimation.duration = duration

        if let delegate: AnyObject = completionDelegate {
            rotateAnimation.delegate = delegate as? CAAnimationDelegate
        }
        self.layer.add(rotateAnimation, forKey: nil)
    }
}

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

Например, мы можем начать делать простую кнопку:

let button = UIButton()
button.frame = CGRect(x: self.view.frame.size.width/2, y: 150, width: 50, height: 50)
button.backgroundColor = UIColor.red
button.setTitle("Name your Button ", for: .normal)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.view.addSubview(button)

Тогда мы можем построить его селектор:

@objc func buttonAction(sender: UIButton!) {
        print("Button tapped")
        sender.rotate360Degrees()
}

Ответ 6

Версия Swift 4, которая позволяет вращать один и тот же вид бесконечное количество раз:

UIView.animate(withDuration: 0.5) {
  self.yourButton.transform = self.yourButton.transform.rotated(by: CGFloat.pi)
}

если вы хотите повернуть на 360 °:

UIView.animate(withDuration: 0.5) {
  self.yourButton.transform = self.yourButton.transform.rotated(by: CGFloat.pi)
  self.yourButton.transform = self.yourButton.transform.rotated(by: CGFloat.pi)
}

Ответ 7

Принятый ответ не был идеальным для моей ситуации.
Я хотел повернуть изображение на 360 градусов, 4 раза с продолжительностью вращения 1 секунда.
Во время ротации анимация не была одинаковой на разных телефонах iPhone 6 против iPhone X.
Более того, когда на экране было 10 видов, и им приходилось выполнять одну и ту же анимацию, некоторые зацикливались один раз, другие зацикливались очень быстро, другие зацикливались очень медленно.

Единственное решение, которое было кратким и непротиворечивым на всех iPhone и на всех экранах, независимо от количества, было это: fooobar.com/info/30858/...

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