Domanda

Dopo aver chiamato MKMapView 's setCenterCoordinate: animato: metodo (senza animazione), mi piacerebbe chiamare selectAnnotation: animato: ( con animazione) in modo tale che l'annotazione salta fuori dalla puntina da disegno neo-centrato.

Per il momento, ho semplicemente guardare per mapViewDidFinishLoadingMap: e quindi selezionare l'annotazione. Tuttavia, questo è problematico. Per esempio, questo metodo non viene chiamato quando non c'è bisogno di caricare i dati di mappe aggiuntive. In questi casi, la mia annotazione non è selezionata. :(

Molto bene. Potrei chiamare questo subito dopo aver impostato la coordinata del centro, invece. Ahh, ma in tal caso è possibile che non vi è dati della mappa per caricare (ma non ha ancora terminato il caricamento). Mi piacerebbe rischiare definendolo troppo presto, con l'animazione di diventare migliore delle ipotesi.

Quindi, se ho capito bene, non è una questione di sapere se il mio coordinare è visibile, dal momento che è possibile allontanarsi quasi una schermata della distanza e devono caricare nuovi dati della mappa. Piuttosto, è una questione di sapere se nuovi dati mappa deve essere caricato, e poi agire di conseguenza.

Tutte le idee su come fare questo, o come altrimenti (affidabile) selezionare un'annotazione dopo la ri-centrare la visualizzazione della mappa sulla coordinate in cui che vive di annotazione?

Gli indizi apprezzato - grazie

È stato utile?

Soluzione

Ho incontrato lo stesso problema, ma ha trovato quello che sembra una soluzione affidabile e ragionevole:

  1. Implementare il metodo delegato MapView: didAddAnnotationViews :. Quando ho provato selezionare l'annotazione direttamente all'interno del metodo delegato, la didascalia sceso al perno! Che sembrava strano, così ho aggiungere un leggero ritardo di mezzo secondo.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Selezionare l'annotazione iniziale, come ci si aspetterebbe, ma selectAnnotation chiamando: animazione;

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    

Sembra che selectAnnotation:animated: non è chiamato in alcune condizioni. Confronta con docs MKMapView :

  

Se l'annotazione specificato non è sullo schermo, e quindi non   hanno una vista annotazione associato, questo metodo non ha effetto.

Altri suggerimenti

Un modo più coerente rispetto all'utilizzo di un timeout fisso è quello di ascoltare il callback regionDidChange. Impostare la coordinata centro della mappa per l'annotazione desiderata, e quando il metodo viene chiamato regionDidChange, quindi selezionare l'annotazione nel centro, per aprire la didascalia.

Ecco un piccolo video di ho preso la cosa in esecuzione in modo casuale tra i 5 pin.

In primo luogo, Goto coordinata centro della annotazione. Diciamo che l'oggetto di annotazione è denominato thePin.

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}

Poi nel metodo regionDidChange, selezionare questa annotazione.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}

Bene solo FYI, questo è ciò che dicono i documenti,

  

Se l'annotazione specificato non è sullo schermo, e quindi non   hanno una vista annotazione associato, questo metodo non ha effetto.

Quindi, se voglio chiamare setCenterCoordinate:animated: o setRegion:animated: e poi voglio selezionare l'annotazione chiamando, selectAnnotation:animated:, l'annotazione non sarà selezionato e il callout non apparirà beacause della esattamente lo stesso motivo di cui sopra in Documenti, Quindi il modo sarebbe bello avere qualcosa di simile, ma la sua non setCenterCoordinate:animated:ComletionBlock lì ..! Il modo in cui ha lavorato per me è come sotto,

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];

Questo vi darà un blocco di completamento e di u possibile utilizzare che per selezionare l'annotazione.

Quello che ha funzionato per me chiamavo selectAnnotation:animated: dal metodo mapView:didAddAnnotationViews::

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
    [mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}

la documentazione di Apple sulla stessa qui

Si noti che ho avuto solo un annotazioni sulla mappa in modo [[mapView annotations] lastObject] andava bene per i miei scopi. La vostra situazione potrebbe essere diversa.

ho avuto un problema simile. Stavo usando il MKPinAnnotationView default con animatesDrop: SI. Dopo ho aggiunto le annotazioni al MKMapView, stavo facendo questo:

[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]

, che nella logica del mio programma, dovrebbe scegliere l'annotazione più vicino. Questo non funzionava. Ho capito il motivo: la vista annotazione non era sullo schermo al momento di questa select chiamata, perché dell'animazione cadere uno spillo. Quindi tutto quello che ho fatto è stato impostato un timer per selezionare l'annotazione un secondo dopo. Si tratta di un hack, ma funziona. Non sono sicuro se funzionerà in ogni situazione, però, ad esempio, su un 3G vs 3Gs. Sarebbe meglio per capire la funzione di callback diritto di metterlo in.

selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
               selector:@selector(selectClosestAnnotation) userInfo:nil
               repeats:NO];

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}

Ho trovato diversi problemi con tutte le soluzioni che ho visto per il mio problema (voglio selezionare un'annotazione quando ho aggiunto da viewDidAppear):

  1. Utilizzando il metodo mapView:didAddAnnotationViews: delegato.

    Questo non ha funzionato per me, perché se l'annotazione specificato non è sullo schermo, e quindi non hanno una vista annotazione associato, questo metodo non ha alcun effetto.

  2. Utilizzando il metodo mapViewDidFinishLoadingMap: delegato.

    Questo non ha funzionato per me o perché la mappa è memorizzato nella cache, in modo che il metodo viene chiamato solo una volta, la prima volta.

Soluzione:

John Blackburn è stato molto vicino, ma senza il metodo mapView:didAddAnnotationViews:. Ho appena chiamo il mio metodo selectAnnotation:, prima che io aggiungo l'annotazione, con un ritardo:

[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];

E questo è quello che faccio nel mio metodo selectAnnotation::

- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
   [self.mapView selectAnnotation:annotation animated:YES];
}

Testato su due iPhone 3GS (iOS 5 e 6) e un iPhone 5.

ho avuto difficoltà simile, ma era in realtà non è in grado di rendere questo metodo di lavoro a tutti, per non parlare in modo incoerente.

Ecco quello che ho trovato a lavorare. Forse funzionerà anche per te: Come innescare vista di dettaglio del MKAnnotationView senza toccare il perno?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top