Wanted: Hvordan pålitelig, konsekvent velger et MKMapView merknad

stemmer
29

Etter å ha ringt MKMapView 's setCenterCoordinate: animerte: metode (uten animasjon), ville jeg liker å kalle selectAnnotation: animerte: (med animasjon) slik at merknaden spretter ut fra den nylig sentrerte stiften.

For nå, jeg bare se for mapViewDidFinishLoadingMap: og velg deretter merknader. Men dette er problematisk. For eksempel er denne metoden ikke kalles når det er ingen grunn til å laste inn ekstra kartdata. I slike tilfeller er min merknad ikke valgt.:(

Veldig bra. Jeg kunne kalle dette umiddelbart etter innstilling senterkoordinatene i stedet. Ahh, men i så fall er det mulig at det er kartdata å laste (men det har ikke ferdig lastet ennå). Jeg ville risikere å kalle det for tidlig, med animasjon blir ustabil i beste fall.

Dermed, hvis jeg forstår riktig, er det ikke et spørsmål om å vite om min koordinere er synlig, siden det er mulig å fjerne seg nesten én skjerm avstand og må laste inn nye kartdata. Snarere er det et spørsmål om å vite om nye kartdata må lastes, og deretter handle deretter.

Noen ideer om hvordan du skal gjøre dette, eller hvordan du ellers (pålitelig) velg en merknad etter re-sentrekartvisningen i koordinatsystemet hvor den merknads liv?

Ledetråder verdsatt - takk!

Publisert på 10/08/2009 klokken 19:53
kilden bruker
På andre språk...                            


7 svar

stemmer
36

Jeg løp inn i det samme problemet, men fant det som virker som en pålitelig og rimelig løsning:

  1. Implementere representanten metode mapView: didAddAnnotationViews :. Når jeg forsøkt velge kommentaren direkte i representanten metode, forklaringen falt med tappen! Det så rart, så jeg legge en liten forsinkelse på et halvt sekund.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Velger du den første merknaden som du forventer, men kaller selectAnnotation: animerte;

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

Det virker som selectAnnotation:animated:ikke er kalt under visse forhold. Sammenlign med MKMapView dokumenter :

Dersom den spesifiserte anmerkningen er ikke på skjermen, og derfor ikke har en tilknyttet annotering syn Denne metode har ingen effekt.

Svarte 16/02/2010 kl. 00:06
kilden bruker

stemmer
7

En mer konsistent måte enn å bruke en fast timeout er å lytte til regionDidChangetilbakeringing. Angi senter koordinere av kartet til ønsket merknader, og når regionDidChange metoden kalles, velg deretter merknaden i sentrum, for å åpne bildeforklaring.

Her er en liten video jeg tok av tingen å kjøre vilkårlig mellom 5 pins.

Først goto sentrum koordinere av merknaden. La oss si at merknadsobjektet heter thePin.

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

Deretter i regionDidChangemetoden, velger du denne merknaden.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Svarte 12/11/2010 kl. 05:23
kilden bruker

stemmer
4

Vel bare så dere vet det, dette er hva docs si,

Dersom den spesifiserte anmerkningen er ikke på skjermen, og derfor ikke har en tilknyttet annotering syn Denne metode har ingen effekt.

Så hvis jeg vil ringe setCenterCoordinate:animated:eller setRegion:animated:og deretter ønsker jeg å velge merknaden ved å ringe, selectAnnotation:animated:, merknaden vil ikke bli valgt, og callout vises ikke beacause av nøyaktig samme grunn som er nevnt ovenfor i docs, så hvordan det ville være flott å ha noe sånt, setCenterCoordinate:animated:ComletionBlockmen det er ikke det ..! Måten som fungerte for meg er som følger,

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

Dette vil gi deg en ferdigstillelse blokk og u kan bruke den til å velge merknad.

Svarte 14/08/2013 kl. 05:43
kilden bruker

stemmer
4

Hva som har fungert for meg var å ringe selectAnnotation:animated:fra mapView:didAddAnnotationViews:metoden:

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

Apple dokumentasjon på den samme her .

Legg merke til at jeg bare hadde en merknad på kartet så [[mapView annotations] lastObject]var greit for mitt formål. Kjørelengden din kan variere.

Svarte 02/11/2009 kl. 18:44
kilden bruker

stemmer
2

Jeg hadde et lignende problem. Jeg brukte standard MKPinAnnotationView med animatesDrop: JA. Etter at jeg har lagt merknadene til MKMapView, gjorde jeg dette:

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

som i logikken i mitt program, bør du velge den nærmeste merknader. Dette virket ikke. Jeg har funnet ut årsaken: merknaden utsikten var ikke på skjermen på tidspunktet for dette velger samtale, på grunn av knappenål falle animasjon. Så alt jeg gjorde var satt en timer for å velge merknaden et sekund senere. Det er en hack, men det fungerer. Jeg er ikke sikker på om det vil fungere i alle situasjoner selv, for eksempel på en 3G vs 3Gs. Det ville være bedre å finne ut den rette tilbakeringingsfunksjonen for å sette det i.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Svarte 15/12/2009 kl. 17:49
kilden bruker

stemmer
1

Jeg har funnet flere problemer med alle løsningene jeg så for mitt problem (jeg vil velge en merknad når jeg har lagt den fra viewDidAppear):

  1. Ved hjelp av mapView:didAddAnnotationViews:representanten metode.

    Dette fungerte ikke for meg fordi hvis den angitte merknader er ikke på skjermen, og derfor ikke har en tilknyttet merknad visning, denne metoden har ingen effekt.

  2. Ved hjelp av mapViewDidFinishLoadingMap:representanten metode.

    Dette fungerte ikke for meg heller, fordi kartet er bufret nå, slik at metoden kalles bare én gang, første gang.

Løsning:

John Blackburn var veldig nær, men uten mapView:didAddAnnotationViews:metoden. Jeg bare ringe min egen selectAnnotation:metode, før jeg legger merknaden, med en forsinkelse:

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

Og dette er hva jeg gjør i min selectAnnotation:metode:

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

Testet på to iPhone 3GS (iOS 5 og 6) og en iPhone 5.

Svarte 23/10/2012 kl. 08:31
kilden bruker

stemmer
0

Jeg hadde lignende problemer med å, men var faktisk ikke i stand til å gjøre denne metoden fungerer i det hele tatt, enn si inkonsekvent.

Her er hva jeg fant på jobb. Kanskje det vil fungere for deg også: Hvordan utløse MKAnnotationView sin bildeforklaring syn uten å berøre pinnen?

Svarte 24/08/2009 kl. 02:53
kilden bruker

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