Actualice las annotations de maps en la rotation de la camera del map de iOS 7

Estoy intentando getlo para que cuando gire un map de iOS 7 que las annotations roten junto con el encabezado de la camera. Imagine que tenía annotations de pin que deben apuntar a North en todo momento.

Esto parecería simple al principio, debería haber un MKMapViewDelegate para get la rotation de la camera pero no lo hay.

He intentado usar los delegates del map para luego consultar el object camera.heading la vista del camera.heading pero, en primer lugar, estos delegates solo parecen llamarse una vez antes y una vez después de un gesto de rotation:

 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 

También intenté usar KVO en el object camera.heading, pero esto no funciona y el object de la camera parece ser algún tipo de object proxy que solo se actualiza una vez que se completa el gesto de rotation.

Mi método más exitoso hasta el momento es agregar un reconocimiento de gesto de rotation para calcular un delta de rotation y utilizarlo con el encabezado de la camera informado al comienzo del delegado de cambio de región. Esto funciona hasta cierto punto, pero en OS 7 puedes "mover" tu gesto de rotation y agrega velocidad que no puedo seguir. ¿Hay alguna forma de rastrear el rumbo de la camera en time real?

 - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { heading = self.mapView.camera.heading; } - (void)rotationHandler:(UIRotationGestureRecognizer *)gesture { if(gesture.state == UIGestureRecognizerStateChanged) { CGFloat headingDelta = (gesture.rotation * (180.0/M_PI) ); headingDelta = fmod(headingDelta, 360.0); CGFloat newHeading = heading - headingDelta; [self updateCompassesWithHeading:actualHeading]; } } - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { [self updateCompassesWithHeading:self.mapView.camera.heading]; } 

Apple no da actualizaciones en time real a la información de un map por desgracia. Su mejor opción es configurar un CADisplayLink y actualizar lo que necesite cuando cambie. Algo como esto.

 @property (nonatomic) CLLocationDirection *previousHeading; @property (nonatomic, strong) CADisplayLink *displayLink; - (void)setUpDisplayLink { self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkFinetworking:)]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; } - (void)displayLinkFinetworking:(id)sender { double difference = ABS(self.previousHeading - self.mapView.camera.heading); if (difference < .001) return; self.previousHeading = self.mapView.camera.heading; [self updateCompassesWithHeading:self.previousHeading]; }