Subclasificar MKAnnotationView y anular setDragState

Se trata de una aplicación para iPhone que utiliza MKMapKit:

Creé un MKAnnotationView personalizado para una Anotación arrastrable. Quiero crear una animación personalizada. Configuré una imagen de pin personalizada y la anotación se puede arrastrar (que no se muestra aquí, sucede en la vista de mapa) 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 hacia arriba, se puede arrastrar y cuando libero la anotación, la vista de mapa recibe el "dragstateending".

Pero ahora quiero que la animación se ejecute durante un período de tiempo y cambie 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 ejecutan según lo deseado durante un segundo y la anotación se puede arrastrar. Pero cuando libero la anotación, la vista de mapa no recibe el final 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 configuro el nuevo centro sin la animación, el globo se mantiene cerrado y solo se abre después de finalizar el arrastre al soltar la anotación.

¿Qué estoy haciendo mal? ¿Es esta la forma correcta de anular setDragState? ¿Realmente tengo que llamar a la superclase? 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 debido a que es una clase interna, no pude encontrar una descripción del método setDragState.

Gracias por ayuda. Salud,

Ben

Respuestas a la pregunta(3)

Su respuesta a la pregunta