I'm trying to follow a car on a map view.
This code should animate the car and the map with the same speed, so that the annotation view always appears in the center:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration: 1.0];
[UIView setAnimationBeginsFromCurrentState:YES];
[car setCoordinate:coord];
[mapView setCenterCoordinate:coord];
[UIView commitAnimations];
It worked fine in iOS 5. In iOS 6 the map is not animating anymore but the car does animate.
I tried [mapView setCenterCoordinate:co animated:YES]
, but then I cannot control the animation speed. It will always animate with the default duration (0.2s).
It seems it is not possible to control the animation speed in iOS 6 when using these methods in
MKMapView
:However I found a private method that has a duration parameter. So I solved my issue by subclassing MKMapView and overriding the private method (which only exists in iOS6):
MyMapView.h
MyMapView.m
I've added 2 properties that allow you to override the default animation time. To use it set
overridesAnimationDuration
to YES before a region change, setmapAnimationDuration
to the desired duration and switchoverridesAnimationDuration
to NO in the delegate callmapView:regionWillChangeAnimated:
.Note, this might not work in future iOS versions because it is private API. Apple can remove or change this method.
I ran into the same kind of issue today. I think the problem does not rely on MKMapView, but the (new) way ios6 manages animations.
It seems that in ios6, if an animation occurs before a previous one has finished (depending on the run loop), the older gets interrupted by the new one. I think this only occurs if the "beginsFromCurrentState" option or property (depending if you are using block based animation or not) is used (by the new one).
To be sure, I think you should try to use block-based animation to see if your animation is really interrupted by another one.
This code must be equivalent to yours, and allows you to see if your animation has been interrupted or cancelled (if "finished" is false) :
(in iOS < 6,"finished" should be true...)
In my case, it appeared that my animation was interrupted by the following UIViewController's methods, which was performed by the system in an animation block, interrupting my animation chain :
I found that the standard UIView AnimationWithDuration would apply if formatted like so:
Hope that works for you too! :)
(note: It was pointed out to me, that this response was geared towards iOS7/8 and that the question was for iOS6. )
And, this simple will actually work fine...