Gezocht: Hoe betrouwbaar, consequent een MKMapView annotatie selecteren

stemmen
29

Na het bellen MKMapView 's setCenterCoordinate: animated: methode (zonder animatie), zou ik willen noemen selectAnnotation: animated: (met animatie), zodat de annotatie naar buiten komt en de nieuw-centered punaise.

Voor nu, ik gewoon kijken naar voor mapViewDidFinishLoadingMap: en selecteer vervolgens de annotatie. Dit is echter problematisch. Zo is deze methode niet wordt aangeroepen wanneer er geen noodzaak om extra kaartgegevens te laden. In die gevallen is mijn annotatie niet geselecteerd.:(

Erg goed. Ik kon deze oproep direct na het instellen van het centrum te coördineren in plaats daarvan. Ah, maar in dat geval is het mogelijk dat er wordt kaartgegevens te laden (maar nog niet volledig geladen). Ik zou het risico noemde het te vroeg, met de animatie steeds slordig op zijn best.

Dus als ik het goed begrijp, het is niet een kwestie van weten als mijn coördineren zichtbaar is, want het is mogelijk om bijna een heel scherm vol afstand dwalen en moet nieuwe kaartgegevens te laden. Integendeel, het is een kwestie van weten of er nieuwe kaart gegevens moeten worden geladen, en vervolgens dienovereenkomstig handelen.

Alle ideeën over hoe om dit te bereiken, of hoe je op een andere manier (betrouwbaar) selecteert u een annotatie na het opnieuw centreren van de kaartweergave op de coördinaten waar deze annotatie levens?

Clues gewaardeerd - dank!

De vraag is gesteld op 10/08/2009 om 20:53
bron van user
In andere talen...                            


7 antwoorden

stemmen
36

Ik liep in het zelfde probleem, maar vond wat lijkt op een betrouwbare en redelijke oplossing:

  1. Implementeren van de afgevaardigde methode Mapview: didAddAnnotationViews :. Toen ik probeerde de aantekening direct te selecteren binnen de afgevaardigde methode, het bijschrift daalde met de pen! Dat zag er vreemd, dus ik voeg een lichte vertraging van een halve seconde.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Selecteer de eerste annotatie zoals je zou verwachten, maar roepen selectAnnotation: geanimeerd;

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

Het lijkt erop dat selectAnnotation:animated:niet onder bepaalde voorwaarden wordt genoemd. Vergelijk met MKMapView docs :

Als de opgegeven annotatie niet scherm, en dus niet een bijbehorende annotatie aanzicht deze methode geen effect.

antwoordde op 16/02/2010 om 01:06
bron van user

stemmen
7

Een meer consistente manier dan het gebruik van een vaste time-out is om te luisteren naar de regionDidChangecallback. Stel het midden coördinaat van de kaart naar de gewenste annotatie, en wanneer de regionDidChange methode wordt genoemd, selecteer de aantekening in het midden, op de call openen.

Hier is een kleine video die ik van het ding willekeurig die tussen 5 pinnen.

Ten eerste, goto het midden coördinaat van de annotatie. Laten we zeggen dat de annotatie object is vernoemd thePin.

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

Dan in de regionDidChangemethode, selecteert u deze annotatie.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
antwoordde op 12/11/2010 om 06:23
bron van user

stemmen
4

Nou gewoon FYI, dit is wat de docs zeggen,

Als de opgegeven annotatie niet scherm, en dus niet een bijbehorende annotatie aanzicht deze methode geen effect.

Dus als ik wil bellen setCenterCoordinate:animated:of setRegion:animated:en dan wil ik de aantekening selecteren door te bellen, selectAnnotation:animated:de annotatie zal niet geselecteerd en de bijschrift verschijnt niet beacause van exact dezelfde reden hiervoor in documenten vermeld, dus de manier waarop het zou zijn geweldig om zoiets te hebben, setCenterCoordinate:animated:ComletionBlockmaar zijn er niet ..! De manier waarop werkte voor mij is, zoals hieronder,

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

Dit geeft je een voltooiing blok te geven en u kunt gebruiken om de aantekening te selecteren.

antwoordde op 14/08/2013 om 06:43
bron van user

stemmen
4

Wat heeft gewerkt voor mij riep selectAnnotation:animated:uit de mapView:didAddAnnotationViews:methode:

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

Apple documentatie over hetzelfde hier .

Merk op dat ik had alleen een aantekening op de kaart zo [[mapView annotations] lastObject]was goed voor mijn doeleinden. Jouw snelheid kan variëren.

antwoordde op 02/11/2009 om 19:44
bron van user

stemmen
2

Ik had een soortgelijk probleem. Ik was met behulp van de standaard MKPinAnnotationView met animatesDrop: JA. Nadat ik de annotaties bij de MKMapView toegevoegd, werd ik om dit te doen:

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

die in de logica van mijn programma, moet de dichtstbijzijnde annotatie te selecteren. Dit werkte niet. Ik dacht dat de reden: de annotatie uitzicht was niet op het scherm op het moment van deze selecte oproep, als gevolg van de pincode afzetten animatie. Dus alles wat ik deed was een timer ingesteld om de annotatie een seconde later te selecteren. Het is een hack, maar het werkt. Ik weet niet zeker of het zal werken in elke situatie wel, bijvoorbeeld op een 3G vs. 3Gs. Het zou beter zijn om erachter te komen van de juiste callback functie om het aan te brengen.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
antwoordde op 15/12/2009 om 18:49
bron van user

stemmen
1

Ik heb een aantal problemen met alle oplossingen zag ik voor mijn probleem (ik wil een annotatie selecteren wanneer ik het toegevoegd viewDidAppear) gevonden:

  1. Met de mapView:didAddAnnotationViews:gemachtigde methode.

    Dit werkte niet voor mij, want als de opgegeven annotatie is niet op het scherm, en dus niet over een bijbehorende aantekening te bekijken, heeft deze methode geen effect.

  2. Met de mapViewDidFinishLoadingMap:gemachtigde methode.

    Dit werkte niet voor mij ook niet, omdat de kaart nu in de cache, zodat de methode slechts een keer wordt genoemd, de eerste keer.

Oplossing:

John Blackburn was heel dicht bij, maar zonder de mapView:didAddAnnotationViews:methode. Ik bel mijn eigen selectAnnotation:methode, voordat ik de annotatie, voeg met een vertraging:

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

En dit is wat ik doe in mijn selectAnnotation:methode:

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

Getest op twee iPhone 3GS (iOS 5 en 6) en een iPhone 5.

antwoordde op 23/10/2012 om 09:31
bron van user

stemmen
0

Ik was met soortgelijke problemen, maar was eigenlijk niet in staat om deze methode te werk helemaal te maken, laat staan ​​inconsistent.

Hier is wat ik gevonden om mee te werken. Misschien zal het ook voor u: Hoe MKAnnotationView's callout uitzicht activeren zonder het aanraken van de pin?

antwoordde op 24/08/2009 om 03:53
bron van user

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