2012-07-11 14 views
12

¿Podemos tener una vista de anotación personalizada para la ubicación actual de los usuarios en iOS?Vista de anotación personalizada para la ubicación del usuario que no mueve la vista de mapa

Necesito eliminar el punto azul (con círculos) con mi propia vista personalizada (digamos un alfiler de ping). ¿Es posible hacer esto?

Si lo hacemos, ¿este pin se mueve a una nueva ubicación cuando hay un cambio en la ubicación del usuario? ¿O necesitamos manejarlo programáticamente?

Observé que si usamos un punto azul predeterminado para la ubicación actual del usuario, entonces se actualiza en el mapa cuando hay un cambio en la ubicación del usuario.

Solo quiero saber si esto se puede hacer con nuestra propia vista personalizada.

Respuesta

14

Sí, puede tener una vista personalizada para la ubicación del usuario.

Desafortunadamente, es más difícil de implementar de lo que debería porque aunque el documentation for the viewForAnnotation delegate method afirma que puede proporcionar su propia vista si la clase de anotación es MKUserLocation, la vista personalizada no se mueve con la ubicación del usuario. De hecho, cuando se devuelve una vista personalizada para MKUserLocation, la vista de mapa deja de actualizar por completo la ubicación del usuario (el método delegado de la vista de mapa didUpdateUserLocation ya no se dispara). Creo que esto es un error.

Una solución consiste en utilizar CLLocationManager y una anotación personalizada ...


Asegúrese showsUserLocation es NO o sin control en la vista del mapa.

Declare propiedades para CLLocationManager y una anotación personalizada utilizando una clase personalizada que implementa el protocolo MKAnnotation (o puede usar la clase genérica MKPointAnnotation).

En viewDidLoad o en algún otro lugar apropiado, cree CLLocationManager, configure su delegate y llame al startUpdatingLocation.

En el location manager's didUpdateToLocation delegate method (no método didUpdateUserLocation delegado de la vista del mapa), crear o actualizar su anotación personalizada:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    if (myUserLocAnnot == nil) 
    { 
     self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease]; 
      //remove the autorelease if using ARC 
     myUserLocAnnot.title = @"You are here"; 
     myUserLocAnnot.coordinate = newLocation.coordinate; 
     [mapView addAnnotation:myUserLocAnnot]; 
    } 
    else 
    { 
     myUserLocAnnot.coordinate = newLocation.coordinate; 
    } 
} 

Por último, en el método delegado de la vista del mapa viewForAnnotation, que se obtendrá una vista de anotación personalizada si la anotación es su anotación de ubicación de usuario personalizada.

+0

enfrentamos el mismo problema, tal vez podemos plantear un error a la manzana – darshansonde

+0

Gracias Anna, está trabajando ahora. Incluso sospecho que hay un error en la vista de mapa que no aparece en nuestra vista de anotación personalizada para la ubicación del usuario cuando lo configuramos. – nkd

+0

Pero un problema más que estoy enfrentando aquí es que, tan pronto como inicie la actualización de la ubicación, recibo la llamada a locationManager: didUpdateToLocation: fromLocation method donde creo la anotación y la agrego al mapa, pero el mapa no muestra mi vista personalizada, incluso aunque estoy devolviendo la vista personalizada. Si apago la ubicación y la ubicación, funciona. ¿Hay algún problema aquí? – nkd

Cuestiones relacionadas