Hoe maak je een MKAnnotation verplaatsen zonder toevoegen / verwijderen uit de kaart?

stemmen
31

Is het mogelijk om te bewegen het coördineren van een MKAnnotation zonder het toevoegen en verwijderen van de annotatie op de kaart?

De vraag is gesteld op 13/02/2010 om 02:44
bron van user
In andere talen...                            


11 antwoorden

stemmen
16

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];
}];
antwoordde op 05/07/2010 om 14:47
bron van user

stemmen
6

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.

antwoordde op 14/03/2011 om 16:19
bron van user

stemmen
4

Subklasse MKPointAnnotation en het heeft de mogelijkheid om de aantekening uitzicht op de kaart om de nieuwe update automatisch te coördineren.

antwoordde op 26/04/2014 om 20:17
bron van user

stemmen
4

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"];
}
antwoordde op 13/03/2012 om 19:30
bron van user

stemmen
2

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:

  1. Geef uw aangepaste MKAnnotationView een verwijzing naar uw MKAnnotation object
  2. Voeg een updateCoordinates methode om de MKAnnotation object en noem het wanneer u wilt locatie van de annotatie wijzigen
  3. Bel regionChanged op het aangepaste MKAnnotationView te laten weten wanneer een herpositionering (bijvoorbeeld wanneer MKAnnotation coördinaten heeft bijgewerkt)
  4. 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.

antwoordde op 15/02/2010 om 04:45
bron van user

stemmen
1

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];
antwoordde op 04/07/2014 om 00:51
bron van user

stemmen
1

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}
antwoordde op 18/07/2012 om 17:31
bron van user

stemmen
1

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).

antwoordde op 16/02/2011 om 14:58
bron van user

stemmen
0

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
}
antwoordde op 15/03/2018 om 09:30
bron van user

stemmen
0

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).

antwoordde op 30/06/2010 om 23:41
bron van user

stemmen
-5

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?

antwoordde op 13/02/2010 om 12:53
bron van user

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