Rotate UIButton 360 degrees

As discussed here, you can also use a CAAnimation. This code applies one full 360 rotation:

Swift 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")

You will need to import QuartzCore:

import QuartzCore

And your ViewController needs to conform to CAAnimationDelegate:

class ViewController: UIViewController, CAAnimationDelegate {

}

Swift 4: Animation nested closure is better than animation delay block.

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)))
       }    
}

Swift 4 version that allows you to rotate the same view infinite times:

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

if you want to rotate 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)
}

You can use a trick: start rotating with 180 degrees first and then rotate with 360 degrees. Use 2 animations with delay. Try this.

UIView.animate(withDuration: 0.5) {
    self.view.transform = CGAffineTransform(rotationAngle: .pi)
}

UIView.animate(
    withDuration: 0.5,
    delay: 0.45,
    options: UIView.AnimationOptions.curveEaseIn
) {
    self.view.transform = CGAffineTransform(rotationAngle: 2 * .pi)
}