If you call stopLoading on the button before the animation for startLoading is finished, the CAAnimationDelegate's animationDidStop for "ShrinkStart" sets the stateLayer's currentState to ".loading" even though stopLoading set the state to success or error and so the button gets stuck in the loading state.
It's annoying and unideal for the user to have to add delays before stopping the loading.