2013-10-03 5 views
5

Ich versuche, es so zu bekommen, dass, wenn Sie eine iOS 7 Karte drehen, dass die Anmerkungen zusammen mit dem Kameraüberblick drehen. Stellen Sie sich vor, ich hätte Stiftnotizen, die immer nach Norden zeigen müssen.Kartenanmerkungen auf iOS 7 Karte Kamera Rotation aktualisieren

Das würde zunächst einfach scheinen, es sollte ein MKMapViewDelegate für die Kamera-Rotation sein, aber es gibt keine.

Ich habe versucht, die Karte Delegierten mit, um dann abfragen, um die camera.heading Objekt Kartenansicht aber erstens scheinen diese Delegierten nur einmal vor und einmal nach einer Drehung Geste aufgerufen werden:

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

Ich habe auch versucht KVO mit auf dem camera.heading-Objekt, aber dies funktioniert nicht und das Kameraobjekt scheint eine Art Proxy-Objekt zu sein, das erst dann aktualisiert wird, wenn die Rotationsbewegung abgeschlossen ist.

Meine bisher erfolgreichste Methode besteht darin, einen Rotationsgestenerkenner hinzuzufügen, um ein Rotationsdelta zu berechnen und dies mit der Kameraüberschrift zu verwenden, die am Anfang des Gebietsänderungsdelegaten gemeldet wurde. Dies funktioniert bis zu einem gewissen Punkt, aber in OS 7 können Sie Ihre Rotationsgeste "streichen" und es fügt Geschwindigkeit hinzu, die ich nicht verfolgen kann. Gibt es eine Möglichkeit, den Kamera-Kurs in Echtzeit zu verfolgen?

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

Antwort

3

Apple gibt keine Echtzeit-Updates für Karteninformationen leider. Am besten ist es, wenn Sie einen CADisplayLink einrichten und alles, was Sie ändern müssen, aktualisieren. Etwas wie das.

@property (nonatomic) CLLocationDirection *previousHeading; 
@property (nonatomic, strong) CADisplayLink *displayLink; 


- (void)setUpDisplayLink 
{ 
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkFired:)]; 

    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
} 


- (void)displayLinkFired:(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]; 
} 
+0

Dank @Ross, es scheint, dies ist die einzige Option. Frustrierend. Ich könnte einen Fehlerbericht einreichen. – Electron

Verwandte Themen