Ricercato: come affidabile, coerente selezionare un'annotazione MKMapView

voti
29

Dopo aver chiamato MKMapView s' setCenterCoordinate: animato: il 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 guardo 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.:(

Ottimo. Potrei chiamare questo subito dopo aver impostato la coordinata del centro, invece. Ahh, ma in questo caso è possibile che ci sia dati cartografici da 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 coordinare dove che vive di annotazione?

Indizi apprezzato - grazie!

È pubblicato 10/08/2009 alle 20:53
fonte dall'utente
In altre lingue...                            


7 risposte

voti
36

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: animato;

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

Sembra che selectAnnotation:animated:non si chiama in alcune condizioni. Confronta con docs MKMapView :

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

Risposto il 16/02/2010 a 01:06
fonte dall'utente

voti
7

Un modo più coerente rispetto all'utilizzo di un timeout fisso è quello di ascoltare il regionDidChangecallback. 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 po ' di video ho preso la cosa in esecuzione in modo casuale tra i 5 pin.

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

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

Poi nel regionDidChangemetodo, selezionare questa annotazione.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Risposto il 12/11/2010 a 06:23
fonte dall'utente

voti
4

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

Se l'annotazione specificata 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 verrà selezionata e il richiamo non apparirà beacause della esattamente lo stesso motivo di cui sopra in Documenti, quindi il modo in cui sarebbe fantastico avere qualcosa di simile, setCenterCoordinate:animated:ComletionBlockma non è 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.

Risposto il 14/08/2013 a 06:43
fonte dall'utente

voti
4

Ciò che ha funzionato per me stava chiamando selectAnnotation:animated:dal mapView:didAddAnnotationViews:metodo:

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

La documentazione di Apple sullo stesso qui .

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

Risposto il 02/11/2009 a 19:44
fonte dall'utente

voti
2

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];
}
Risposto il 15/12/2009 a 18:49
fonte dall'utente

voti
1

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 mapView:didAddAnnotationViews:metodo delegato.

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

  2. Utilizzando il mapViewDidFinishLoadingMap:metodo 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 mapView:didAddAnnotationViews:metodo. Ho appena chiamo il mio selectAnnotation:metodo, 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 selectAnnotation:metodo:

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

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

Risposto il 23/10/2012 a 09:31
fonte dall'utente

voti
0

Stavo avendo 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 la spina?

Risposto il 24/08/2009 a 03:53
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more