Come posso creare un’animazione “pin-drop” personalizzata usando MKAnnotationView?

Ho un’istanza di MKMapView e vorrei usare icone di annotazione personalizzate al posto delle icone pin standard fornite da MKPinAnnotationView. Quindi, ho creato una sottoclass di MKAnnotationView chiamata CustomMapAnnotation e sto sovrascrivendo -(void)drawRect: per disegnare un CGImage. Questo funziona.

Il problema arriva quando provo a replicare la funzionalità .animatesDrop fornita da MKPinAnnotationView; Mi piacerebbe che le mie icone appaiano gradualmente, cadute dall’alto e nell’ordine da sinistra a destra, quando le annotazioni vengono aggiunte all’istanza di MKMapView .

Ecco – (void) drawRect: per CustomMapAnnotation, che funziona quando si disegna la UIImage (che è ciò che fa la seconda linea):

 - (void)drawRect:(CGRect)rect { [super drawRect:rect]; [((Incident *)self.annotation).smallIcon drawInRect:rect]; if (newAnnotation) { [self animateDrop]; newAnnotation = NO; } } 

Il problema si presenta quando aggiungi il metodo animateDrop :

 -(void)animateDrop { CGContextRef myContext = UIGraphicsGetCurrentContext(); CGPoint finalPos = self.center; CGPoint startPos = CGPointMake(self.center.x, self.center.y-480.0); self.layer.position = startPos; CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"position"]; theAnimation.fromValue=[NSValue valueWithCGPoint:startPos]; theAnimation.toValue=[NSValue valueWithCGPoint:finalPos]; theAnimation.removedOnCompletion = NO; theAnimation.fillMode = kCAFillModeForwards; theAnimation.delegate = self; theAnimation.beginTime = 5.0 * (self.center.x/320.0); theAnimation.duration = 1.0; [self.layer addAnimation:theAnimation forKey:@""]; } 

Semplicemente non funziona, e potrebbero esserci molti motivi per cui. Non voglio entrare in tutti loro ora. La cosa principale che voglio sapere è se l’approccio è corretto, o se dovrei provare qualcosa di completamente diverso.

Ho provato anche a impacchettare il tutto in una transazione di animazione in modo che il parametro beginTime potesse effettivamente funzionare; questo sembrava non fare nulla. Non so se questo è perché mi manca qualche punto chiave o se è perché MapKit sta distruggendo le mie animazioni in qualche modo.

  // Does nothing [CATransaction begin]; [map addAnnotations:list]; [CATransaction commit]; 

Se qualcuno ha esperienza con MKMapAnnotations animati come questo, mi piacerebbe qualche suggerimento, altrimenti se puoi offrire consigli CAAnimation sull’approccio, sarebbe fantastico.