Gesucht: Wie zuverlässig, konsequent eine MKMapView Anmerkung wählen

stimmen
29

Nach dem Aufruf von MKMapView ‚s setCenterCoordinate: animierte: Methode (ohne Animation), würde Ich mag nennen selectAnnotation: animierte: (mit Animation) , so dass die Anmerkung aus dem neu zentriert Reißzwecke herausspringt.

Vorerst sehe ich einfach für mapViewDidFinishLoadingMap: und dann die Anmerkung auswählen. Dies ist jedoch problematisch. Zum Beispiel wird diese Methode nicht aufgerufen , wenn es nicht notwendig ist , zusätzliche Kartendaten zu laden. In diesen Fällen wird meine Anmerkung nicht ausgewählt.:(

Sehr gut. Ich kann dies sofort anrufen , nachdem die Mitte statt koordinieren Einstellung. Ahh, aber in diesem Fall ist es möglich , dass es ist Kartendaten zu laden (aber es ist noch nicht fertig geladen). Ich würde riskieren , es zu früh, mit der Animation immer fleckige besten anrufen.

Wenn ich also richtig verstehen, dann ist es nicht darum zu wissen , ob mein Koordinaten sichtbar ist, da es möglich ist , fast eine Bildschirmseite der Entfernung streunen und neue Kartendaten laden. Vielmehr geht es darum , zu wissen , ob neue Kartendaten geladen werden muss, und dann entsprechend handeln.

Alle Ideen, wie dies zu erreichen, oder wie man sonst (zuverlässig) wählen Sie eine Anmerkung nach dem erneuten Zentrieren der Kartenansicht auf der Koordinate, wo das Annotations Lebens?

Clues geschätzt - danke!

Veröffentlicht am 10/08/2009 um 20:53
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
36

Ich lief in das gleiche Problem, aber gefunden, was wie eine zuverlässige und vernünftige Lösung scheint:

  1. Umsetzung der Delegatmethode mapView: didAddAnnotationViews :. Als ich versuchte, die Anmerkung direkt innerhalb der Delegatmethode Auswahl fiel die Legende mit dem Stift! Das sah seltsam, so füge ich eine leichte Verzögerung von einer halben Sekunde.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Wählen Sie die anfängliche Anmerkung wie man erwarten würde, aber Aufruf selectAnnotation: animiert;

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

Es scheint , dass selectAnnotation:animated:nicht unter bestimmten Bedingungen genannt wird. Vergleichen Sie mit MKMapView docs :

Wenn die angegebene Anmerkung nicht auf dem Bildschirm ist, und daher nicht eine zugehörige Anmerkungsansicht hat, hat diese Methode keine Auswirkungen.

Beantwortet am 16/02/2010 um 01:06
quelle vom benutzer

stimmen
7

Ein konsequenter Weise als eine feste Timeout verwendet , ist auf den hören regionDidChangeRückruf. Die Mitten Koordinate der Karte auf die gewünschte Annotation, und wenn die regionDidChange Methode aufgerufen wird, dann wählt die Anmerkung in der Mitte, die callout zu öffnen.

Hier ist ein kleines Video ich die Sache nahm zufällig zwischen 5 Pins ausgeführt wird .

Zuerst Dreht zur Mitte der Annotation koordinieren. Sagen wir , das Anmerkungsobjekt benannt ist thePin.

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

Dann in der regionDidChangeMethode, wählen Sie diese Anmerkung.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Beantwortet am 12/11/2010 um 06:23
quelle vom benutzer

stimmen
4

Nun nur FYI, das ist, was die docs sagen,

Wenn die angegebene Anmerkung nicht auf dem Bildschirm ist, und daher nicht eine zugehörige Anmerkungsansicht hat, hat diese Methode keine Auswirkungen.

Also , wenn ich anrufen wollen setCenterCoordinate:animated:oder setRegion:animated:und dann möchte ich die Anmerkung wählen durch den Aufruf, selectAnnotation:animated:wird die Anmerkung nicht ausgewählt bekommen und die Legende erscheint nicht beacause der exakt gleichen Grund , der oben in docs erwähnt, so wie es wäre toll, dass so etwas wie, setCenterCoordinate:animated:ComletionBlockaber es ist nicht da ..! Die Art und Weise , die für mich gearbeitet ist wie unten,

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

Dadurch erhalten Sie einen Abschluss Block und u können, dass die Anmerkung wählen verwenden.

Beantwortet am 14/08/2013 um 06:43
quelle vom benutzer

stimmen
4

Was hat sich für mich gearbeitet wurde Aufruf selectAnnotation:animated:aus dem mapView:didAddAnnotationViews:Verfahren:

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

Apple - Dokumentation auf demselben hier .

Beachten Sie, dass ich nur auf der Karte eine Anmerkung hatte so [[mapView annotations] lastObject]fein war für meine Zwecke. Ihre Ergebnisse können variieren.

Beantwortet am 02/11/2009 um 19:44
quelle vom benutzer

stimmen
2

Ich habe ein ähnliches Problem. Ich war mit dem Standard-MKPinAnnotationView mit animatesDrop: JA. Nachdem ich die Anmerkungen zu dem MKMapView hinzugefügt, tat ich dies:

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

die in der Logik meines Programms, sollte die nächste Anmerkung auswählen. Dies war nicht funktioniert. Ich dachte, der Grund heraus: die Anmerkungsansicht zum Zeitpunkt dieser ausgewählten Anruf nicht auf dem Bildschirm war, wegen der Stecknadel fallen Animation. Also alles, was ich tat, war einen Timer einstellen, die Anmerkung eine Sekunde später auszuwählen. Es ist ein Hack, aber es funktioniert. Ich bin mir nicht sicher, ob es aber in jeder Situation arbeiten wird, zum Beispiel auf einer 3G vs. 3Gs. Es wäre besser, die richtige Callback-Funktion, um herauszufinden, um es in.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Beantwortet am 15/12/2009 um 18:49
quelle vom benutzer

stimmen
1

Ich habe einige Probleme mit allen Lösungen finde ich für mein Problem sehe (Ich möchte eine Anmerkung wählen, wenn ich es von viewDidAppear hinzugefügt):

  1. Mit Hilfe der mapView:didAddAnnotationViews:Delegatmethode.

    Das ist nicht für mich arbeiten, weil, wenn die angegebene Anmerkung nicht auf dem Bildschirm ist, und daher nicht eine zugehörige Anmerkungsansicht hat, hat diese Methode keine Wirkung.

  2. Mit Hilfe der mapViewDidFinishLoadingMap:Delegatmethode.

    Das hat bei mir nicht funktioniert, entweder weil die Karte nun im Cache gespeichert wird, so dass die Methode nur einmal aufgerufen wird, das erste Mal.

Lösung:

John Blackburn war sehr eng , aber ohne die mapView:didAddAnnotationViews:Methode. Ich nenne nur meine eigene selectAnnotation:Methode, bevor ich die Anmerkung hinzufügen, mit einer Verzögerung:

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

Und das ist , was ich in meiner tun selectAnnotation:Methode:

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

Getestet auf zwei iPhone 3GS (iOS 5 und 6) und ein iPhone 5.

Beantwortet am 23/10/2012 um 09:31
quelle vom benutzer

stimmen
0

Ich hatte ähnliche Schwierigkeiten, war aber eigentlich nicht in der Lage diese Methode Arbeit überhaupt zu machen, geschweige denn inkonsequent.

Hier ist , was ich zur Arbeit gefunden. Vielleicht wird es auch für Sie arbeiten: Wie MKAnnotationView der callout Ansicht ohne Berührung der Stift auszulösen?

Beantwortet am 24/08/2009 um 03:53
quelle vom benutzer

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