2010-11-06 11 views
10

Tengo un conjunto de datos de anotaciones que se pueden actualizar muy rápidamente. En este momento elimino todas las anotaciones antes de volver a colocarlas en el mapa.MKMapView moviendo anotaciones automáticamente: ¿animarlas?

NSArray *existingpoints = [mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]; 
[mapView removeAnnotations:existingpoints]; 

calculo donde están todas maneras dentro del objeto de manera personalizada le gustaría ser capaz de llamar a esto y "mover" la anotación sin quitar y volver a agregar de nuevo al mapa. El ejemplo de llamada que hago que funciona y me gustaría casi "sondear" está a continuación.

- (CLLocationCoordinate2D) coordinate 
{ 
    CLLocationCoordinate2D coord; 
    coord.latitude = [lat doubleValue]; 
    coord.longitude = [lon doubleValue]; 


     double differencetime = exampleTime; 
     double speedmoving; 
     double distanceTravelled = speedmoving * differencetime; 

     CLLocationDistance movedDistance = distanceTravelled; 
     double radiansHeaded = DEG2RAD([self.heading doubleValue]); 
     CLLocation *newLocation = [passedLocation newLoc:movedDistance along:radiansHeaded]; 
     coord = newLocation.coordinate; 

    return coord; 
} 

a lo solicitado, el archivo .h del objeto, que no tienen un método SetCoordinate ..

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 
#import <MapKit/MapKit.h> 

@interface TestObject : NSObject <MKAnnotation>{ 
    NSString *adshex; 
    NSString *lat; 
    NSString *lon; 


    NSString *title; 
    NSString *subtitle; 


    CLLocationCoordinate2D coordinate; 
} 
@property(nonatomic,retain)NSString *adshex; 
@property(nonatomic,retain)NSString *lat; 
@property(nonatomic,retain)NSString *lon; 


@property(nonatomic,retain)NSString *title; 
@property(nonatomic,retain)NSString *subtitle; 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 


- (CLLocationCoordinate2D) coordinate; 

@end 
+0

¿Tiene un método setCoordinate en su objeto de anotación o simplemente el método de coordenadas? Muestre el archivo .h para su objeto de anotación. – Anna

+0

No, no, agregué .h a la edición –

Respuesta

20

Si actualiza la anotación de coordenadas utilizando un método setCoordinate (o equivalente), el La vista de mapa actualizará automáticamente la posición de la anotación en la vista. This page en la documentación dice lo siguiente:

Importante: Cuando se implementa la coordenada propiedad en su clase, Se recomienda que sintetizar su creación . Si decide implementar los métodos de esta propiedad usted mismo, o si modifica manualmente la variable subyacente a esa propiedad en otras partes de su clase después de la anotación se ha agregado al mapa, asegúrese de enviar clave -value observando notificaciones (KVO) cuando haces. Map Kit utiliza las notificaciones de KVO a para detectar cambios en la coordenada, el título y las propiedades de los subtítulos de sus anotaciones y hacer los cambios necesarios en la visualización del mapa. Si lo hace no envía notificaciones KVO, la posición de sus anotaciones no puede actualizarse correctamente en el mapa .

La vista de mapa solo sabrá volver a leer la propiedad de coordenadas de la anotación si se indica (a través de KVO) que la coordenada ha cambiado. Una forma de hacerlo es implementar un método setCoordinate y llamarlo donde sea que tenga el código que actualiza la ubicación de la anotación.

En su código, está volviendo a calcular las coordenadas en la propiedad de coordenadas de solo lectura. Lo que podría hacer es añadir esto al archivo de anotación .m (y al .h):

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate 
{ 
    //do nothing 
} 

y en el lugar donde puede actualizar ubicaciones, llame al método setCoordinate en la anotación:

[someAnnotation setCoordinate:someAnnotation.coordinate]; 

Puede hacer esto en el lugar donde actualmente elimina/vuelve a agregar las anotaciones.

La llamada anterior se ve graciosa porque tiene la recalculación de coordenadas en el método de obtención de coordenadas. Aunque debería funcionar como una solución/prueba rápida, no recomiendo usarla regularmente.

En su lugar, puede recalcular la ubicación de la anotación fuera (donde actualmente elimina/vuelve a agregar las anotaciones) y pasar la nueva coordenada a setCoordinate.Su objeto de anotación podría almacenar su nueva ubicación en los ivars lat/lng que tiene actualmente (configurarlos en setCoordinate y usar solo aquellos para construir un CLLocationCoordinate2D para devolver desde el getter) o (mejor) usar el ivar de coordenadas en sí mismo (configurarlo) setCoordinate y devolverlo en el getter).

+0

El enlace a la nota "Importante" ha cambiado: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps .html # // apple_ref/doc/uid/TP40009497-CH6-SW2 – Anna

+0

Desafortunadamente, no anima la transición. ¿Alguien sabe de alguna forma de mover una anotación animadamente? – devios1

+2

Descubrí cómo. Ver http://stackoverflow.com/a/8564097/238948 – devios1

Cuestiones relacionadas