I assume that when you say โcontrol the entire state of theโ Rounded button โ, you mean that you want to have a way to know that the view has started the animation, something like a callback viewHasMovedABitAutomatically :) If this is the case, as far as I know, there is no implemented way for CA to do this, however, look at this question: Callback progress for kernel animation Here you can make a workaround that looks pretty nice, maybe you can work on something from now on.
Oh, and one thing. I see that you are using a Pan gesture recognizer. I was just looking at both your code and tarmes (the guy in the other thread;)), but I think he used drawInContext to check the layer. It can also cause if your view is being dragged, so if that happens, consider using some viewIsBeingDragged flag in the pan method and check it on the callback.
EDIT: Sorry, this doesn't seem to have anything to do with your real problem. I understand that you mean controlling the speed of the animation so that they all move accordingly. Tell us about it.
As far as I know, there is no such thing as a "step" animation. Animating an image to move 20 pixels to the left does not necessarily mean that the image will be redrawn 20 times. The image will be displayed as many times as needed, so we cannot rely on the rendering method to calculate it. As far as I know, the only way to control the speed of an animation is with the duration animateWithDuration: parameter. And you do not know the duration, you want the speed to be constant, so the duration is what is required.
Basic physics: duration is equal to distance divided by speed, so if we had the distance we needed to cover, we could easily calculate the duration of the animation. At first I thought that maybe UIBezierPath had a method or attribute to calculate the total length, but I was wrong. However, there is code in this Get CGPath stream of total length that computes it through numerical integration, you should check it to see if it works. When you have this, you can do something like this (I have not tested it, I just entered the pseudo code)
#define SPEED_CALIBRATION 30.0
Something like that. getBezierPathDistance is the method from the stream above, if it works, and animateView:withDuration:andBezierPath: is your method for performing non-linear animation using the CA documentation (I donโt remember all the details, but I remember that it was a rather long fragment code;)).
I apologize if the answer is a little vague, let him hope this helps!