Answering myself. I implemented all of MKMapViewDelegate's methods and it seems that
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
is called on pan, and
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
is called as soon as deceleration stops (and not before).