Предотвращение непрерывного повторного масштабирования и повторного центрирования MKMapView до местоположения пользователя
Кажется, у меня есть противоположная проблема со многими из тех, что были размещены здесь около MKMapView
. Вместо того, чтобы не получить его для увеличения и отображения текущего местоположения, я не могу заставить его прекратить это делать. Вот что происходит:
- Я запускаю приложение
- MKMapView показывает мое местоположение с голубой точкой
- Я уменьшаю и удаляю карту, используя пальцы.
- Через несколько секунд MKMapView неожиданно увеличит масштаб, чтобы снова центрировать свое текущее местоположение.
Я пробовал передать CLLocationManager
stopUpdatingLocation
stopUpdatingLocation
(нет эффекта, так как MKMapView
знает, как использовать CoreLocation
), и я попытался передать MKMapView
на setShowsUserLocation:NO
(no голубая точка отображается вообще, что не то, что я хочу). Я даже пытался исключить мой CLLocationManager
(без эффекта). Что вызывает это и как его остановить?
Да, я устанавливаю точность и расстояние менеджера местоположений в -loadView
.
Я не реализую -mapViewDidFinishLoadingMap
:. Вот моя реализация
-locationManager:didUpdateToLocation:fromLocation:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// How many seconds ago was this new location created?
NSTimeInterval t = [[newLocation timestamp] timeIntervalSinceNow];
// CLLocationManagers will return the last found location of the device first,
// you don't want that data in this case. If this location was made more than 3
// minutes ago, ignore it.
if (t < -180)
{
// This is cached data, you don't want it, keep looking
return;
}
[locationManager stopUpdatingLocation];
}
Я думаю, что это центрирование, о котором вы просите, @Анна Каренина:
- (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u
{
CLLocationCoordinate2D loc = [u coordinate];
// Display the region 500 meters square around the current location
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 500, 500);
[mv setRegion:region animated:YES];
}
Ответы
Ответ 1
Не используйте метод - (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u
.
Вместо этого используйте locationmanager didUpdateToLocation
.
didUpdateUserLocation
вызывается несколько раз без каких-либо причин. Где didUpdateToLocation
вызывается при возникновении любых изменений местоположения.
Тогда u может вручную установить область mkmapview в методе didUpdateToLocation
.
Ответ 2
Во-первых, и я не знаю, что это сильно повлияет на многое, но вы установите точность и фильтр местоположения на всех в viewDidLoad
(или везде, где вы реализуете свой менеджер locationManager):
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
Во-вторых, проверьте эти 2 функции в своем источнике (проигнорируйте содержимое фактических функций, которые я здесь привел, он просто для иллюстрации и показывает использование), и, если возможно, укажите свой код для этих функций, чтобы мы могли лучше помочь
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
[activityIndicator stopAnimating];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSDate* eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 15.0)
{
NSLog(@"New Latitude %+.6f, Longitude %+.6f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}
}
Ответ 3
Я использую dispatch_once в методе MKMapViewDelegate для масштабирования только один раз в начале. Вот код.
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
CLLocationCoordinate2D newCoordinate = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude);
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newCoordinate, 500, 500);
[mapView setRegion:region animated:YES];
});
}