2011-09-23 24 views
11

Parece que tengo el problema opuesto al de muchos de los publicados aquí acerca de MKMapView. En lugar de no poder acercarlo y mostrar la ubicación actual, parece que no puedo obtenerlo en detener. Esto es lo que sucede:Cómo evitar que MKMapView vuelva a enfocar y volver a centrar continuamente en la ubicación del usuario

  • pongo en marcha la aplicación
  • El MKMapView muestra mi ubicación con un punto azul
  • i zoom hacia fuera y lejos en el mapa usando los dedos
  • Después de unos segundos, el MKMapView de repente se amplía de nuevo a centro de mi ubicación actual de nuevo

he intentado decirle a mi CLLocationManager-stopUpdatingLocation (ningún efecto, ya que un MKMapView sabe cómo utilizar CoreLocation), y he intentado decirle MKMapView a setShowsUserLocation:NO (no se muestra ningún punto azul, que no es lo que quiero). Incluso intenté eliminar mi CLLocationManager (sin efecto). ¿Qué está causando esto y cómo lo detengo?


Sí, he puesto la precisión y la distancia a la gerente de locación en -loadView.

No implemento -mapViewDidFinishLoadingMap:. Aquí está mi aplicación de

-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]; 
} 

Creo que este es el que está centrado preguntar sobre, @Anna Karenina:

- (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]; 
} 
+0

¿Dónde haces el centrado? En 'mapView: didUpdateUserLocation:'? ¿Puedes publicar ese código? – Anna

+0

Se llamará al método didUpdateUserLocation cada vez que cambie la ubicación del usuario o se obtenga una nueva lectura. Puede agregar un bool ivar que pueda verificar/establecer en el método para que el centrado se realice solo una vez _OR_ puede centrarse de manera condicional en u.location.horizontalAccuracy o u.location.timestamp. – Anna

+0

Ok, eso tiene sentido, pero ... ahora tengo -mapView: didUpdateUserLocation: centrando condicionalmente si u.location.horizontalAccuracy es> locationManager.desiredAccuracy y todavía está sucediendo. Si reverso la condición, no obtengo un zoom inicial. – DJHoward

Respuesta

0

En primer lugar, y yo no sé que esto afectará mucho las cosas, pero no configura su exactitud localizadores y el filtro de la distancia en absoluto en viewDidLoad (o donde sea que esté implementando su locationManager):

[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locationManager setDistanceFilter:kCLDistanceFilterNone]; 

segundo lugar, comprobar estas 2 funciones en y nuestra fuente (ignoran el contenido de las funciones reales que he mencionado aquí, es sólo para ilustración y para demostrar uso) y si es posible, proporcione su código de estas funciones para que podamos ayudarle mejor:

- (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); 
    } 
} 
4

No implemente el método - (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u.

En su lugar use locationmanager didUpdateToLocation.

didUpdateUserLocation se invoca varias veces sin ningún motivo. Cuando se produce un cambio de ubicación, se invoca didUpdateToLocation.

Luego puede establecer manualmente la región mkmapview en el método didUpdateToLocation.

0

Utilizo dispatch_once en el método MKMapViewDelegate para acercarme solo una vez al principio. Aquí está el código.

- (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]; 
    }); 
} 
Cuestiones relacionadas