Любой обходной путь к MKUserTrackingModeFollow с головной ошибкой в iOS6?
Я отчаянно ищу обходной путь к хорошо документированной ошибке в MapKit в iOS6, которая делает MKUserTrackingModeFollowWithHeading эффективно непригодным для использования при больших увеличениях:
Есть очень простой пример проекта [здесь]. ( https://dl.dropboxusercontent.com/u/316978/MapKitBug.zip)
Действия по воспроизведению:
- Нажмите кнопку MKUserTrackingModeButton, чтобы увеличить ваше местоположение.
- Нажмите, чтобы увеличить ближе 2 или 3 раза.
- Нажмите MKUserTrackingModeButton, чтобы выбрать MKUserTrackingModeFollowWithHeading
Вопросы:
Этот режим не "залипает" и почти всегда выходит через несколько секунд (1-20). Синий "Ваше местоположение" Аннотация "вибрирует" и, кажется, слегка смещается от своего центрального положения, пока оно находится в MKUserTrackingModeFollowWithHeading.
Обратите внимание, что это становится все более серьезной проблемой при увеличении масштаба. При увеличении по умолчанию (к которому вы привыкли при первом нажатии кнопки MKUserTrackingModeButton, это не такая большая проблема.
Очевидным обходным решением будет ограничение уровня масштабирования, но, к сожалению, мне нужно полное масштабирование в моем приложении.
2 ответа
Я тоже расстроился из-за этой чрезвычайно раздражающей ошибки.
У меня есть крайний срок не за горами, поэтому я не могу тратить много времени, пытаясь найти обходной путь.
Мне удалось заставить его оставаться в MKUserTrackingModeFollowWithHeading при максимальном увеличении, но "булавка" аннотации местоположения пользователя все еще сильно колебалась, а в некоторых крайних случаях она все еще возвращалась в MKUserTrackingModeFollow.
Первоначально я сделал принудительное исправление, используя флаги BOOL в методе regionDidChangeAnimated: Delegate, например:
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated {
NSLog(@"regionWillChangeAnimated:");
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
NSLog(@"regionDidChangeAnimated:");
[self forceCorrectUserTrackingMode];
}
- (void)forceCorrectUserTrackingMode {
if (shouldFollowWithHeading == YES && ([mapView userTrackingMode] != MKUserTrackingModeFollowWithHeading) ) {
NSLog(@"FORCE shouldFollowWithHeading! - setUserTrackingMode:MKUserTrackingModeFollowWithHeading");
[self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
} else if (shouldFollowWithHeading == NO && ([mapView userTrackingMode] != MKUserTrackingModeNone) ) {
NSLog(@"FORCE should NOT FollowWithHeading - setUserTrackingMode:MKUserTrackingModeNone");
[self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES];
}
}
Это на самом деле сблизило меня, но это не было достаточно надежно, и, как я уже сказал, мне пришлось подумать о том, чтобы расставить приоритеты для других функций в мой срок, поэтому я в итоге и сделал:
Сначала я взял этот код для увеличения категории на MKMapKit: http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/
Затем я включил этот метод, который посетитель предоставил в комментариях этого блога:
- (int) getZoomLevel { return 21 – round(log2(mapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapView.bounds.size.width))); }
Наконец, небольшое пробное и ошибочное тестирование уровней масштабирования и появления ошибки привело меня к следующему "обходному пути":
CLLocationCoordinate2D userLocation_CenterCoordinate = CLLocationCoordinate2DMake([locationManager location].coordinate.latitude, [locationManager location].coordinate.longitude); int currentZoomLevel = [MKMapView getZoomLevelForMapView:mapView]; int newZoomLevel = 17; if (currentZoomLevel > 17) { NSLog(@"Adjusting mapView's zoomLevel from [%d] to [%d], also centering on user's location", currentZoomLevel, newZoomLevel); [mapView setCenterCoordinate:userLocation_CenterCoordinate zoomLevel:newZoomLevel animated:NO]; } else { NSLog(@"Centering on user's location, not adjusting zoom."); [mapView setCenterCoordinate:userLocation_CenterCoordinate animated:NO]; }
Открыл TSI, и Apple подтвердила, что обходного пути нет. Интересно, исправят ли они это в 7 …