2010-06-28 5 views
12

Ich erstellte zuvor eine benutzerdefinierte Callout-Blase als Unteransicht der MKAnnotationView, weil das eingebaute Callout so begrenzt ist. Dies erfordert, dass ich zu centerOffset der MKAnnotationView wechsle, wenn es ausgewählt wird, um die Größe der Callout-Blase zu berücksichtigen. Das alles funktionierte perfekt, bevor iOS 4 herauskam. Jetzt, mit iOS 4, ignoriert es vollständig die Aktualisierung der centerOffset-Eigenschaft und daher scheinen der Pin und die Blase nach unten und nach rechts zu springen (die obere linke Ecke der Callout-Blase befindet sich jetzt an der Stelle, wo der Pin-Punkt sein sollte) .MKMapView ignoriert Update von CenterOffset in iOS 4

Weiß jemand, warum dies in iOS 4 geändert hat? Kann ich etwas tun, damit MKMapView das neue centerOffset erkennt? Ist das ein Fehler, den Apple eingeführt hat?

Danke für die Hilfe!

+0

Ich wollte nur einsteigen, stieß auf das gleiche Problem. Ich habe derzeit das Annotationszentrum angepasst, um die Offsetänderung zu kompensieren. Es ist aber alles andere als ideal. –

Antwort

0

Ich denke, anstatt centerOffset können Sie setRegion verwenden, die in allen Versionen gut funktioniert.

CGPoint point = [mapView convertCoordinate:selectedAnnotation.coordinate toPointToView:self.view]; 

CGRect frame = [customView frame]; 
frame.origin.y = point.y - frame.size.height; 
frame.origin.x = point.x - frame.size.width/2; 

MKCoordinateRegion region = [mapView convertRect:frame toRegionFromView:self.view]; 
[mapView setRegion:region animated:YES]; 
+0

Wir versuchen nicht, den Bereich der Karte anzupassen, sondern den Mittenversatz der tatsächlichen Anmerkungsansicht. –

+0

@Yannick, ja, aber die Region mit den gleichen Abmessungen, aber eine neue Mittelkoordinate wird die Karte neu zentrieren. Ich würde sagen, dass dies die Antwort ist, nachdem ich die gleichen Probleme hatte wie du. – makdad

+2

Es ist nicht das, was ich versuche zu erreichen. Die aktuelle Kartenregion muss gleich bleiben. Ich möchte, dass die Anmerkungsansicht entsprechend ihrer neuen centerOffset-Eigenschaft verschoben wird. –

4

Ich habe das gleiche Problem - centerOffset scheint nur beim ersten Mal berücksichtigt werden. Es wird intern geändert, aber die Ansicht wird nicht verschoben. Sie müssen also die Ansicht selbst verschieben.

Sie können die Ansicht verschieben, indem Sie ihren Mittelpunkt mit dem erforderlichen Versatz anpassen - die ausgewählte Ansicht bleibt in der oberen linken Ecke mit der nicht ausgewählten Ansicht ausgerichtet, sodass Sie ihre Zentren neu ausrichten müssen. Hier ist mein Fall:

Ausgewählte -> Unselected:

self.center = CGPointMake(self.center.x + 56.0, self.center.y + 130.0); 
self.centerOffset = CGPointMake(5.0, -14.0); 

Unselected -> Auswahl:

self.center = CGPointMake(self.center.x - 56.0, self.center.y - 130.0); 
self.centerOffset = CGPointMake(64.0, -81.0); 

Wo 130 ist die Höhendifferenz zwischen den Ansichten (Mittelpunkt ist an der Unterseite) und 56 ist der Unterschied zwischen den X-Offsets ihrer Zentren.

Erinnern - Sie müssen den Mittenversatz immer noch ändern, da er beim Zoomen berücksichtigt wird.

Hoffe, das hilft, ich habe ein paar Stunden auf diesem verloren. Denken Sie daran, einen Fehlerbericht an Apple zu senden.

+0

Danke, das hat mir geholfen! – elsurudo

+0

arbeitete für mich, danke! –

6

Stellen Sie sicher, Sie verwenden MKAnnotationView und nicht MKPinAnnotationView! Sie können das centerOffset eines MKPinAnnotationView -Objekts nicht setzen (außer wenn Sie natürlich Unterklasse sind).