17 Stimmen

Wie kann man verhindern, dass die viewForAnnotation-Methode den Standard-Benutzerstandort blue beacon in iOS überschreibt

Im Moment fülle ich eine Kartenansicht mit Anmerkungen auf und zeige auch den aktuellen Standort des Benutzers an. Mit der viewForAnnotation-Methode werden alle Anmerkungen mit der standardmäßigen roten Stecknadel überschrieben, aber ich möchte die Ansichten für die anderen Anmerkungen zurückgeben, aber den Benutzerstandort mit dem standardmäßigen blauen Leuchtfeuer beibehalten. Gibt es eine Möglichkeit, dies einfach zu tun, oder muss ich eine neue Anmerkungsansicht erstellen und je nach Anmerkung die richtige zurückgeben?

Im Moment habe ich etwas wie:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if (annotation.coordinate == locationManager.location.coordinate) {

return nil;

    }else {

    MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Beacon"];

    // Button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    button.frame = CGRectMake(0, 0, 23, 23);
    annotationView.rightCalloutAccessoryView = button;

    annotationView.canShowCallout = YES;

    return annotationView;
}
}

Aber ich kann die beiden nicht gleichsetzen, weil ich die Koordinateneigenschaft nicht aus dem Anmerkungsargument herausbekommen kann.

Kennt jemand eine Lösung für dieses Problem?

30voto

calimarkus Punkte 9830

Sehen Sie sich die Dokumentation hier an:

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html

Wie es dort heißt:

Wenn das Objekt im Annotationsparameter eine Instanz der MKUserLocation Klasse können Sie eine benutzerdefinierte Ansicht zur Bezeichnung der den Standort des Benutzers. Um den Standort des Benutzers mit der Standard Systemansicht anzuzeigen, geben Sie nil zurück.

Sie können dies folgendermaßen überprüfen:

if([annotation isKindOfClass: [MKUserLocation class]]) {
  return nil;
}

Schnell:

guard annotation as? MKUserLocation == nil else { return nil }

0voto

HalR Punkte 11034

Swift 5.0

Setzen Sie ein Häkchen an den Anfang der Funktion, um die userLocation zu ignorieren:

   func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard annotation as? MKUserLocation != mapView.userLocation else { return }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X