You can stop animations with something like
This might be a case where using a timer instead of UIView.animate would be useful. It would avoid blocking user interaction while the animation is running. In particular, you could use CADisplayLink, which is a timer that synchronizes with the display refresh rate.
There is tutorial for that here:
The CADisplayLink version is at the end. It starts using a regular timer for the balloon effect, and then replaces it with CADisplayLink.
Instead of making an animation, you setup a method to calculate the appropriate increment of the contentOffset, and then have CADisplayLink call it for each frame. If you use the CACurrentMediaTime to track elapsed time, as shown in the tutorial, you can calculate the offset precisely each time, even if the time interval varies.
With user interaction enabled, you could then just stop the timer when the user touches the view, and they would be able to scroll manually again.