2010-03-14 12 views
10

Estoy usando MapKit para mostrar la ubicación del usuario en relación con las patillas a su alrededor. Me gustaría poder imitar la funcionalidad que ofrece Maps a través del botón de la cruz en la esquina inferior izquierda de la pantalla. Ya soy consciente de que MapKit proporciona un objeto CLLocation con la ubicación del usuario a través de MKUserLocation, solo quería pedir consejo sobre cómo debería centrarme en esa ubicación. Mi inclinación inicial era usar un NSTimer para centrar el mapa en esa coordenada cada 500 ms más o menos.Cómo seguir la ubicación del usuario con MapKit

¿Hay una mejor manera de hacerlo? ¿Hay algo incorporado en MapKit que me falta que logre esto?

Muchas gracias, Brendan

Respuesta

7

creo que iba a utilizar realmente el CoreLocation CLLocationManager y utilizar su método delegado locationManager:didUpdateToLocation:fromLocation:.

De esta manera, no tiene la sobrecarga de un NSTimer, y solo se actualiza cuando hay una nueva ubicación disponible.

Puede extraer la longitud y la latitud del objeto CLLocation enviado al método locationManager:didUpdateToLocation:fromLocation: y pasarlo a la vista del mapa.

+0

¿No sería esto más ineficaz al final, ya que MapKit ya está usando el GPS de todos modos? Yo pensaría que el GPS usaría más potencia que un temporizador. Dicho esto, hay una gran posibilidad de que esté equivocado. Solo he estado programando en el iphone por 1 semana. – bloudermilk

+0

¿Entonces está diciendo que Core Location ** no ** usa GPS? –

+0

Estoy diciendo que CL * does * usa GPS. Entonces, si dos clases hacían ping al receptor GPS (el CLLocationManager interno de MapKit para el pin de ubicación de usuario azul y el CLLocationManager propuesto) podría terminar usando mucha más potencia que el MapLoge Manager de MapKit interno y un NSTimer simple. Supongo que esto se reduce a si el iPhone SDK es lo suficientemente inteligente como para admitir múltiples CLLocationManagers sin conectarlos directamente al GPS. ¿O quizás el delegado de MapKit proporciona su propio didUpdateToLocation :? – bloudermilk

0

Voy con la respuesta de Jacob Relkin. El tutorial This proporciona un procedimiento paso a paso para usar CoreLocation en una aplicación de iPhone. Espero que esto te ayude.

Todo lo mejor.

+0

@Warrior, gracias :) –

12

Es realmente simple hacer que el mapa actualice la ubicación del usuario automáticamente al igual que los mapas de Google. Basta con establecer showsUserLocation a SÍ

self.mapView.showsUserLocation = YES 

... y luego poner en práctica el MKMapViewDelegate para volver a centrar el mapa cuando se actualiza la ubicación.

-(void)    mapView:(MKMapView *)mapView 
     didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    if(isTracking) 
    { 
     pendingRegionChange = YES; 
     [self.mapView setCenterCoordinate: userLocation.location.coordinate 
           animated: YES]; 
    } 
} 

Y para permitir al usuario hacer zoom & sartén sin robar la vista de nuevo a la ubicación actual ...

-(void) mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    if(isTracking && ! pendingRegionChange) 
    { 
     isTracking = NO; 
     [trackingButton setImage: [UIImage imageNamed: @"Location.png"] 
         forState: UIControlStateNormal]; 
    } 

    pendingRegionChange = NO; 
} 

-(IBAction) trackingPressed 
{ 
    pendingRegionChange = YES; 
    isTracking = YES; 
    [mapView setCenterCoordinate: mapView.userLocation.coordinate 
         animated: YES]; 

    [trackingButton setImage: [UIImage imageNamed: @"Location-Tracking.png"] 
        forState: UIControlStateNormal]; 
} 
+0

¿Es mejor usar el centro de MKMApView con la siguiente ubicación de usuario que CoreLocation? Tenía una clase LocationUpdater que devuelve una nueva CLLocation cuando se actualiza. ¿MKMapView se actualiza con la misma frecuencia? – quantumpotato

39

Si estás en iOS5 + Esto es muy fácil. Sólo cambia el "userTrackingMode" utilizando un código como:

[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 

Esto hará sin problemas los usuarios seguir ubicación actual. Si arrastra el mapa, incluso establecerá el modo de seguimiento nuevamente en MKUserTrackingModeNone, que generalmente es el comportamiento que desea.

+7

Otra prueba de las limitaciones obvias del concepto de respuesta aceptada. ¡Esta es la respuesta que debería estar en la cima! La respuesta de Jacob fue excelente hace cuatro años, pero ahora está completamente obsoleta, pero se mantendrá para siempre como la primera respuesta. – KPM

Cuestiones relacionadas