webentwicklung-frage-antwort-db.com.de

Passen Sie das MKAnnotationView-Callout an

Ich möchte ein benutzerdefiniertes MKAnnotationView-Callout erstellen, wie in diesem Bild gezeigt. Ich habe mehrere Lösungen getestet, aber sie erlauben nur die Anpassung der linken/rechten Bilder und des Titels/Untertitels. Kann mir jemand bitte Quellcode oder Tutorial-Link dazu geben? 

Momentan bin ich ahnungslos. Bitte helfen.

enter image description here

42
Janak Nirmal

Ich verstehe, dass Sie eine Stecknadel mit einem benutzerdefinierten Text wünschen. 

Wir können keine benutzerdefinierte Beschriftung erstellen, aber wir können eine Anmerkung mit einer vollständig angepassten Ansicht erstellen. Der Trick besteht also darin, eine zweite Anmerkung hinzuzufügen, wenn die erste ausgewählt ist, und die zweite Anmerkungsansicht wie eine Beschriftungsblase aussehen zu lassen.

Dies ist die Lösung, die von Benutzern djibouti33 und jacob-jennings in der Antwort gepostet wird: MKAnnotationView - Benutzerdefinierte Anmerkungsansicht sperren, um Standortaktualisierungen zu fixieren , die wiederum in einem Blog basiert Post von Asynchrony Solutions. Zur Erklärung finden Sie hier einige UML aus einem gegabelten Projekt: Annotation with custom XIB

Dies ist ein großer Hack, aber auch die sauberste Art, benutzerdefinierte Annotationen zu implementieren. 

Beginnen Sie mit einer NSObject-Klasse "Content", die über eine Koordinate verfügt, die Klasse der Callout-Ansicht (in der UML ist AnnotationView, Sie können hier jedoch weitere erstellen und festlegen) und ein Wörterbuch mit Zufallswerten mit Titel, Foto url usw. Verwenden Sie diese Klasse, um ein MKAnnotation-Objekt "Annotation" zu initialisieren.

#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...

@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...

Die Annotation implementiert AnnotationProtocol, um anzukündigen, dass sie die Erstellung ihrer eigenen MKAnnotationView durchführen möchte. Das heißt, Ihr MKMapViewDelegate sollte folgenden Code haben:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation 
{
    // if this is a custom annotation, delegate the implementation of the view
    if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) {
        return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView];
    } else {
        // else, return a standard annotation view
        // ...
    }
} 

Die zurückgegebene Ansicht hat den Typ AnnotationView, der AnnotationViewProtocol implementiert, um anzukündigen, dass die Auswahl/Abwahl behandelt werden soll. Daher sollten in Ihrem Kartenansicht-Controller die Methoden mapView: didSelectAnnotationView: und mapView: didDeselectAnnotationView: auf ähnliche Weise delegieren wie zuvor.

Wenn die Anmerkung ausgewählt ist, wird eine zweite Anmerkung (CalloutAnnotation) hinzugefügt, die demselben Verhalten folgt. Diesmal wird jedoch die zurückgegebene Ansicht (CalloutView) von einer XIB initialisiert und enthält Core Graphics-Code (in BaseCalloutView) zum Animieren und Replizieren einer aufbieten, ausrufen, zurufen.

Der Initialisierer der CalloutView-Klasse:

- (id)initWithAnnotation:(CalloutAnnotation*)annotation
{
    NSString *identifier = NSStringFromClass([self class]);
    self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
    if (self!=nil){
        [[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil];
        // prevent the tap and double tap from reaching views underneath
        UITapGestureRecognizer *tapGestureRecognizer = ...
    }
    return self;
}

Um einen anderen Ansichtscontroller aus der Callout-Ansicht verschieben zu können, habe ich Benachrichtigungen verwendet.

Die SO - Antwort, die ich oben verlinkt habe, enthält zwei vollständige Projekte, die diesen Code implementieren (Klassennamen können abweichen). Ich habe ein anderes Projekt unter Verwendung der UML unter https://github.com/j4n0/callout .

49
Jano

Ich weiß, dass diese Frage aus dem Jahr 2011 stammt, aber für Leute, die sie immer noch in einer Suche finden: In iOS 9 haben Sie MKAnnotationView.detailCalloutAccessoryView, der den Standard-Callout vollständig ersetzt.

0
bio

Ich habe in MKAnnotationView ein benutzerdefiniertes UIButton hinzugefügt. Und durch Klicken auf diese Schaltfläche habe ich popOver mit rootViewController mit der gleichen Ansicht wie oben gezeigt.

0
Mahesh