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