Is het mogelijk om te bewegen het coördineren van een MKAnnotation zonder het toevoegen en verwijderen van de annotatie op de kaart?
Hoe maak je een MKAnnotation verplaatsen zonder toevoegen / verwijderen uit de kaart?
Ik vond een vrij eenvoudige methode. Ik wilde de positie van mijn speler faalde te werken zonder te verwijderen en vervolgens opnieuw toevoegen van de speler annotatie. Dit werkt goed voor pre-iOS4 apps, en wat het doet is zowel verplaats de pin en centreren van de kaart op de nieuwe locatie van de pin's:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];
Hier is het hetzelfde, maar met de aanbevolen block-functie voor iOS4:
[UIView animateWithDuration:0.5 animations:^{
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
Het is inderdaad mogelijk zonder het verwijderen en toevoegen van de annotatie off-course.
U moet uw MKAnnotation observeren te coördineren en de positie van de MKAnnotationView bij te werken wanneer het verandert. Als alternatief kunt u (en dit is waarschijnlijk de meest elegante manier van doen) af te leiden uw eigen MKAnnotation en MKAnnotationView en maken ze "roerend".
Zie met mobiele MKAnnotationView een gedetailleerd voorbeeld dat eveneens luistert de positie van de annotatie.
Subklasse MKPointAnnotation en het heeft de mogelijkheid om de aantekening uitzicht op de kaart om de nieuwe update automatisch te coördineren.
Gewoon gebruik maken van KVO:
[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];
Als uw MKAnnotation heeft een setCoordinate methode, net onder deze regels daar:
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
[self willChangeValueForKey:@"coordinate"];
coordinate = newCoordinate;
[self didChangeValueForKey:@"coordinate"];
}
Weet niet of het is meer algemeen mogelijk, maar het is als je je eigen aangepaste MKAnnotationView.
Ik was in staat om de aanpak gedocumenteerd op aan te passen http://spitzkoff.com/craig/?p=108 door Craig Spitzkoff:
- Geef uw aangepaste MKAnnotationView een verwijzing naar uw MKAnnotation object
- Voeg een updateCoordinates methode om de MKAnnotation object en noem het wanneer u wilt locatie van de annotatie wijzigen
- Bel regionChanged op het aangepaste MKAnnotationView te laten weten wanneer een herpositionering (bijvoorbeeld wanneer MKAnnotation coördinaten heeft bijgewerkt)
- In drawRect op de interne uitzicht object in handen van de aangepaste MKAnnotationView kunt u verplaatsen met behulp van de coördinaten van de MKAnnotation (je met een verwijzing naar het).
Je zou waarschijnlijk een verdere vereenvoudiging van deze aanpak - je mag niet een interne object in alle omstandigheden het oog vereisen.
Nadat u de coördinaten of een andere eigenschappen van de aantekening bij te werken, bel volgende MKMapViewDelegate methode om uw annotatie herschrijven:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
bijvoorbeeld:
myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
De meeste antwoorden zijn gebaseerd op feit dat uw annotatie is geboekt via MKPlacemark verlengd. Maar hoe zit het met een ander object (image ie gewoonte marker) die alleen implementeert MKAnnotation protocol? Het zou niet de setCoordinate methode. Dus hier is het antwoord op basis van code, die door 100 gram
MKAnnotationView *av = [self.mapView viewForAnnotation:user];
//user is an object which implements <MKAnnotation>
// You will probably get your MKAnnotationView in your own way
if (av){
// here user returns CLLocationCoordinate2D coordinate
MKMapPoint mapPoint = MKMapPointForCoordinate([user getLastLocation]);
// converting mapPoint to CGPoint
CGPoint newPos;
CGFloat zoomFactor = self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
newPos.x = mapPoint.x/zoomFactor;
newPos.y = mapPoint.y/zoomFactor;
// animation for annotation's move
static NSString *POSITION_KEY=@"positionAnimation";
static NSString *PATH_ANIMATION_KEY=@"position";
if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:PATH_ANIMATION_KEY];
animation.fromValue = [NSValue valueWithCGPoint:av.center];
animation.toValue = [NSValue valueWithCGPoint:newPos];
animation.duration = 0.3;
animation.delegate = av;
animation.fillMode = kCAFillModeForwards;
[av.layer addAnimation:animation forKey:POSITION_KEY];
}
// moving view
av.center = newPos;
Dus je moet in principe om de corresponderende MKAnnotationView die kan ook door iteratie via alle aantekeningen worden gerealiseerd te krijgen en het is nieuwe locatie. Ik maakte een array houder voor elk van het (NSMutableArray * mapAnnotaions), dus nu kon ik alleen maar herhalen houd van:
for (id annotation in mapAnnotaions) {call refresh method here for id}
Als u een verwijzing naar uw aantekening te houden, maken een wijziging in het pand te coördineren, de annotatie toe te voegen dan weer om de kaart, de locatie van de annotatie weergave wordt bijgewerkt. U hoeft niet naar de annotatie (die zal leiden tot de aantekening oog op tijdelijk verdwijnen) te verwijderen. Dit zal niet geven u een leuke overgang voor wanneer de annotatie coördinaat wordt echter bijgewerkt. Het maakt ook niet leiden tot een geheugenlek noch zijn er een veelvoud van dezelfde annotatie toegevoegd aan de kaart (als je kijkt naar het aantal van aantekeningen op de Mapview, blijft constant wanneer u opnieuw toe te voegen annotatie).
In Swift 4.0 en IOS 11.0, voeg ik gewoon attribuut dynamic om het pand te coördineren van het kind klasse van MKAnnotation klasse en het werkt: All Annotations op MapView werken hun locatie als coördineren waarde van MKAnnotation objecten worden bijgewerkt:
class CarAnnotation: NSObject, MKAnnotation {
@objc dynamic var coordinate: CLLocationCoordinate2D
//Add your custom code here
}
Neem een kijkje op mijn MapKitDragAndDrop monster, staat het u te werken MKAnnotation en bewegen MKAnnotationView op zowel de iPhone OS 3 en iOS 4 (zal gebruik maken van de ingebouwde slepen ondersteuning).
Het lijkt niet mogelijk om te veranderen de coördinaten van een MKAnnotation object en vervolgens de MKMapView de hoogte van de wijziging.
Echter, het verwijderen van de vorige annotatie van de kaart, het veranderen van de coördinaten van uw annotatie object en het toevoegen van het terug naar de kaart werkt goed.
[theMapView removeAnnotation:myAnnotation];
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];
Waarom wil je niet om het op deze manier doen?













