Se trata de una aplicación de iPhone usando MKMapKit:subclases MKAnnotationView y setDragState primordial
yo creamos una costumbre MKAnnotationView para una anotación que pueden arrastrarse. Quiero crear una animación personalizada. Me puse una imagen de pin costumbre y la anotación es arrastrable (que ambos no se muestra aquí, sucede en el MapView) con el siguiente código:
- (void) movePinUpFinished {
[super setDragState:MKAnnotationViewDragStateDragging];
[self setDragState:MKAnnotationViewDragStateDragging];
}
- (void) setDragState:(MKAnnotationViewDragState) myState {
if (myState == MKAnnotationViewDragStateStarting) {
NSLog(@"starting");
CGPoint endPoint = CGPointMake(self.center.x,self.center.y-20);
self.center = endPoint;
[self movePinUpFinished];
}
if (myState == MKAnnotationViewDragStateEnding) {
NSLog(@"ending");
[super setDragState:MKAnnotationViewDragStateEnding];
[self setDragState:MKAnnotationViewDragStateNone];
[super setDragState:MKAnnotationViewDragStateNone];
}
if (myState == MKAnnotationViewDragStateDragging) {
NSLog(@"dragging");
}
if (myState == MKAnnotationViewDragStateCanceling) {
NSLog(@"cancel");
}
if (myState == MKAnnotationViewDragStateNone) {
NSLog(@"none");
}
}
Todo funciona bien, la anotación se mueve un poco, es arrastrable y cuando lanzo la anotación, la vista de mapa recibe el "estado de arrastre".
pero ahora quiero que la animación se ejecuta durante un período de tiempo y cambiar el dragStateStarting a lo siguiente:
if (myState == MKAnnotationViewDragStateStarting) {
NSLog(@"starting");
CGPoint endPoint = CGPointMake(self.center.x,self.center.y-20);
[UIView animateWithDuration:1.0
animations:^{ self.center = endPoint; }
completion:^(BOOL finished){ [self movePinUpFinished]; }];
}
Las animaciones se ejecuta como quería en el período de un segundo y la anotación es arrastrable. Pero cuando publico la anotación, la vista de mapa no está recibiendo la terminación a través del delegat. Lo que también reconocí fue que cuando estoy haciendo la animación con "UIView animateWithDuration ..." es que inmediatamente después de comenzar el arrastre, cuando comienza la animación, se abre el globo de la anotación. Cuando estoy configurando el nuevo centro sin la animación, el globo se mantiene cerrado y solo se abre después de terminar el arrastre soltando la anotación.
¿Qué estoy haciendo mal? ¿Es esta la manera correcta de anular setDragState? ¿Realmente tengo que llamar a la súper clase? Pero sin establecer el estado de arrastre en la superclase, mi vista de mapa no se dio cuenta de los cambios del estado de arrastre.
Me pregunto acerca de la implementación original de MKPinAnnotationView, pero como es una clase interna I no pude encontrar una descripción del método setDragState.
Thx para obtener ayuda. Saludos,
Ben
¿Cómo funcionó perfectamente? Cuando arrastra el pin fuera de la pantalla, se produce un bloqueo. – akshay1188
Esto funciona, pero una cosa me desconcierta: en mi MKMapViewDelegate, sobreescribo mapView: annotationView: didChangeDragState. La clase base MKAnnotationView produce dos transiciones: desde 0-> 1 cuando se inicia el arrastre, y 1-> 4 cuando termina. Esta solución anterior parece seguir las directrices de Apple para la T, pero produce una transición de 0-> 2 y una 2-> 0. Puedo vivir con eso, pero es extraño, creo que la documentación de Apple está apagada, para ser honesto. – n13
Creo que necesitas llamar 'self.dragState = ...', no 'dragState ='. De lo contrario, las notificaciones KVO no se enviarán, y la vista del mapa no verá el cambio del estado de arrastre. – Rick