Я тоже столкнулся с этой проблемой только сейчас. Я не уверен, является ли это ожидаемым поведением или нет, но по какой-то причине мы должны переместить наши пользовательские представления аннотаций MKUserLocation.
Наивное решение
- (void) locationController: (LocationController *) locationController
didUpdateToLocation: (CLLocation *) location
{
[[self mapView] setShowsUserLocation:NO];
[[self mapView] setShowsUserLocation:YES];
}
Но это заставляет текущую аннотацию местоположения прыгать по экрану, который я нашел нежелательным.
Еще лучше сохранить ссылку на пользовательский вид аннотации в виде ивара в контроллере вида, а затем выполнить:
- (void) locationController: (LocationController *) locationController
didUpdateToLocation: (CLLocation *) location
{
CGPoint newCenterPoint = [[self mapView] convertCoordinate:[location coordinate] toPointToView:[[self customAnnotationView] superview]];
newCenterPoint.x += [[self customAnnotationView] centerOffset].x;
newCenterPoint.y += [[self customAnnotationView] centerOffset].y;
[UIView animateWithDuration:0.3f animations:^{
[[self customAnnotationView] setCenter:newCenterPoint];
}];
}
Это хорошо, за исключением того, что когда вы изменяете уровень масштабирования, аннотация остается там, где она была относительно прямоугольника вида карты, а затем анимируется в правильное положение только после завершения масштабирования или панорамирования. Лучше всего последовать примеру Apple и сделать так, чтобы аннотации текущего местоположения исчезали и появлялись вновь при изменении региона:
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
[[self mapView] setShowsUserLocation:NO];
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
[[self mapView] setShowsUserLocation:YES];
}