MKAnnotationView – Blocca vista annotazione personalizzata per appuntare gli aggiornamenti di posizione

Aggiornamento n. 5 Immagino che sia il momento della taglia. Più di 100 visualizzazioni e nessuno ha preso una pugnalata, nemmeno con l’esempio di codice che ho pubblicato. Che ne dici di alcuni punti reputazione!

Aggiornamento n. 4 Questa è una domanda piuttosto complicata, quindi ho creato un nuovo progetto basato su tabs che include solo le parti della mia app con cui ho problemi qui. Puoi scaricarlo da: http://www.servinitup.net/CustomCalloutAnnotation.zip Sentiti libero di aprirlo (devi aggiungere il tuo identificatore di bundle per eseguirlo sul tuo telefono) e giocare con esso, e vedere se tu puoi ottenere quell’annotazione callout dannata per muoverti con lo spillo!

Aggiornamento n. 3 Provato a impostare setAnnotation come metodo pubblico del tutorial CalloutMapAnnotationView e chiamarlo direttamente. Non ho avuto fortuna. Nonostante le piccole stranezze che si sono verificate, l’unica cosa che si è mossa è stata la piccola porzione triangular del callout. Non è stato ansible spostare l’intero callout.

Aggiornamento n. 2 Ancora non è stata una gran fortuna, ma ora stiamo cercando modi per creare un “pizzico da ingrandire” a livello di codice e quindi annullarlo immediatamente, in modo che l’utente non veda mai una modifica. Sperando che ciò avvenga a livello programmatico avrà lo stesso effetto di farlo manualmente e l’annotazione del callout tornerà al suo genitore. Qualche idea?

Aggiornamento n. 1 Dopo aver giocato qui è dove ho ottenuto: – sostituito self.calloutAnnotation.coordinate = coords; con self.calloutAnnotation.latitude = coords.latitude;self.calloutAnnotation.longitude = coords.longitude; – Con quello modificato, se pizzico leggermente la mappa per ingrandire o ridurre dopo che il pin è stato aggiornato, l’annotazione del callout si anima nella posizione corretta, proprio sopra il pin.

Quindi ora ho bisogno di capire come ottenere che questo accada senza che l’utente debba effettivamente pizzicare per ingrandire.

Post originale

Io, insieme ad altri utenti SO, sto usando questa fantastica soluzione per creare un’annotazione di callout personalizzata: http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/

Quando si utilizza un callout standard (annotationview.canShowCallout = true) e il pin si muove sullo schermo man mano che la posizione viene aggiornata, il callout standard segue il pin, come se fossero bloccati insieme.

Quando si utilizza la soluzione di callout personalizzata sopra, quando il mio pin si sposta dopo gli aggiornamenti di posizione, l’annotazione del callout rimane nella posizione originale. Certo, mi piacerebbe imitare lo standard iOS e avere la traccia di annotazione del callout personalizzata insieme al pin.

Ecco il codice che ho finora, che sta spostando con successo la vista di annotazione, ma non la visualizzazione di annotazione del callout personalizzato:

 / * la posizione principale trasmette una notifica e il controller della mia vista ascolta questa notifica e chiama locationManagerDidFindLocation * /
 - (void) locationManagerDidFindLocation: (NSNotification *) notif {
     CLLocation * location = [notif.userInfo objectForKey: @ "location"];
     Coordinate CLLocationCoordinate2D = [coordinate posizione];
     MKCoordinateSpan span = MKCoordinateSpanMake ((5/69), (5/69));
     MKCoordinateRegion region = {coords, span};

     // se non abbiamo ancora una posizione corrente, crearne una, posizionarla sulla mappa e regolare la regione della mappa
     // altrimenti, aggiorna il posizionamento dell'annotazione e la posizione della mappa in un'animazione fluida
     if (self.currentLocationAnnotation == nil) {
         self.currentLocationAnnotation = [[CurrentLocationAnnotation alloc] initWithCoordinate: coords andTitle: @ "My Title" and Subtitle: @ "My subtitle"];

         [self.mapView addAnnotation: self.currentLocationAnnotation];
         [self.mapView setRegion: region animated: true];
         [self.mapView regionThatFits: region];
     } altro {
         [UIView beginAnimations: nil context: NULL];
         [UIView setAnimationDuration: 0.45];
         [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];

             // questo sposta la mia vista di annotazione perfettamente
             self.currentLocationAnnotation.coordinate = coords;

             // ******* questo è il mio problema
             // ******* questa vista annotazione callout personalizzata rimane
             // ******* nel suo posto originale, anche se lo è
             // ******* La vista annotazione principale si sposta sullo schermo
             self.calloutAnnotation.coordinate = coords;

             [self.mapView setRegion: region animated: true];
             [self.mapView regionThatFits: region];
         [UIView commitAnimations];
     }
 }