     self.setNeedsUpdateConstraints()
     
     UIView.animateWithDuration(0.25, animations: { () -> Void in
-      
       self.layoutIfNeeded()
+      }, completion: completetion)
+  }
+  
+  internal func animateSpinner() {
+    
+    UIView.animateKeyframesWithDuration(1.25, delay: 0.0, options: [.Repeat, .BeginFromCurrentState, .CalculationModePaced], animations: { () -> Void in
+      
+      UIView.addKeyframeWithRelativeStartTime(0.0,
+        relativeDuration: 0.25,
+        animations: { () -> Void in
+          self.spinnerImageView.layer.transform = self.rotationTransform(90.0)
+      })
+      
+      UIView.addKeyframeWithRelativeStartTime(0.25,
+        relativeDuration: 0.25,
+        animations: { () -> Void in
+          self.spinnerImageView.layer.transform = self.rotationTransform(180.0)
+      })
+      
+      UIView.addKeyframeWithRelativeStartTime(0.50,
+        relativeDuration: 0.25,
+        animations: { () -> Void in
+          self.spinnerImageView.layer.transform = self.rotationTransform(270.0)
+      })
+      
+      UIView.addKeyframeWithRelativeStartTime(0.75,
+        relativeDuration: 0.25,
+        animations: { () -> Void in
+          self.spinnerImageView.layer.transform = self.rotationTransform(360.0)
+      })
       
       }) { (complete: Bool) -> Void in
         if complete {
-          self.userInteractionEnabled = true
+        
         }
     }
-  }
-  
-  internal func animateSpinner() {
     
   }
   
   internal func stopAnimatingSpinner() {
-    
+    self.spinnerImageView.layer.removeAllAnimations()
   }
   
   

        self.buttonView.backgroundColor = ConceptColors.MediumBlue
        self.buttonLabel.textColor = ConceptColors.OffWhite
        self.currentButtonState = .Following
        self.spinnerImageView.alpha = 0.0
        expandButton()
        
      case .Loading:
        // Why not set the text to an empty string? Its because our height
        // constraints are being held by the labels intrinsic content size
        // In fact, this (the entire animation) works because of the label's size
        // Without it, I would have to adjust way more constraints
        self.buttonView.backgroundColor = UIColor.whiteColor()
        self.currentButtonState = .Loading
        self.spinnerImageView.alpha = 1.0
        shrinkButton()
    }
  }
  
  
  // MARK: Other Helpers
  
  
  // MARK: - Animations
  // ------------------------------------------------------------
  internal func shrinkButton() {
    
    guard self.minButtonWidth != nil && self.minButtonWidth > 0.0 else { return }
    self.userInteractionEnabled = false

      
    case .Following:
      self.updateButtonToState(.NotFollowing)
    }
  }
  
