Subclassificando MKAnnotationView e substituindo setDragState

Trata-se de um aplicativo para iPhone usando o MKMapKit:

Eu criei um MKAnnotationView personalizado para uma anotação arrastável. Eu quero criar uma animação personalizada. Defino uma imagem de alfinete personalizada e a anotação é arrastável (o que não é mostrado aqui, acontece no mapview) com o seguinte 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");
     }
}

Tudo funciona bem, a anotação é movida um pouco para cima, é arrastável e quando solto a anotação, o mapview recebe o "dragstateending".

Mas agora eu quero que a animação seja executada por um período de tempo e altere o dragStateStarting para o seguinte:

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]; }];
     }

As animações são executadas conforme desejado durante o período de um segundo e a anotação é arrastável. Mas quando libero a anotação, o mapview não está recebendo o final através do delegado. O que eu também reconheci foi que, quando estou fazendo a animação com "UIView animateWithDuration ...", é que imediatamente após o início do arrasto, quando a animação é iniciada, o balão da anotação é aberto. Quando estou definindo o novo centro sem a animação, o balão permanece fechado e só é aberto após o término do arrasto, liberando a anotação.

O que estou fazendo errado? É este o caminho certo para substituir o setDragState. Eu realmente tenho que ligar para a super turma? Mas, sem definir a dragstate na superclasse, meu mapview não percebeu as alterações da dragstate.

Gostaria de saber sobre a implementação original do MKPinAnnotationView, mas como é uma classe interna, não consegui encontrar uma descrição do método setDragState.

Thx por ajuda. Felicidades,

Ben

questionAnswers(3)

yourAnswerToTheQuestion