Hogyan lehet mozgatni egy MKAnnotation nélkül hozzáadása / eltávolítása a térképről?

szavazat
31

Lehetséges, hogy mozog a koordináta egy MKAnnotation nélkül hozzáadása és eltávolítása a kommentárt a térkép?

A kérdést 13/02/2010 02:44
a forrás felhasználó
Más nyelveken...                            


11 válasz

szavazat
16

Találtam egy nagyon egyszerű módszerrel. Azt akartam frissíteni a játékos pozíciója simán eltávolítása nélkül, majd újra hozzáadni a játékos kommentár. Ez jól működik az előre iOS4 alkalmazásokat, és mit csinál egyszerre mozog a csap és a térkép közepére a csap új helyét:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];

Itt ugyanaz a dolog, de az ajánlott blokk funkció iOS4:

[UIView animateWithDuration:0.5 animations:^{
    [player setCoordinate:aLoc.coordinate];
    [mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
Válaszolt 05/07/2010 14:47
a forrás felhasználó

szavazat
6

Valóban lehetséges, anélkül, hogy eltávolítaná, és hozzá a kommentár off-tanfolyam.

El kell megfigyelni a MKAnnotation koordináta és frissíti a MKAnnotationView pozícióját, ha megváltozik. Másik lehetőség, hogy lehet (és valószínűleg ez a elegánsabb módja csinálja) származik saját MKAnnotation és MKAnnotationView, és azokat „mozgó”.

Lásd Mozgó-MKAnnotationView a részletes példát, amely szintén animál helyzetét a kommentár.

Válaszolt 14/03/2011 16:19
a forrás felhasználó

szavazat
4

Alosztály MKPointAnnotation és azt a lehetőséget, hogy frissítse a kommentár kilátás a térképet az új koordináta automatikusan.

Válaszolt 26/04/2014 20:17
a forrás felhasználó

szavazat
4

Csak használja KVO:

[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];

Ha a MKAnnotation van setCoordinate módszer, csak ezeket a sorokat ott:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    [self willChangeValueForKey:@"coordinate"];
    coordinate = newCoordinate;
    [self didChangeValueForKey:@"coordinate"];
}
Válaszolt 13/03/2012 19:30
a forrás felhasználó

szavazat
2

Nem tudom, hogy ez több, általában lehetséges, de ez, ha saját egyéni MKAnnotationView.

Tudtam, hogy alkalmazkodjanak a megközelítés dokumentálni http://spitzkoff.com/craig/?p=108 Craig Spitzkoff:

  1. Adjon egyéni MKAnnotationView hivatkozni a MKAnnotation objektum
  2. Adjunk hozzá egy updateCoordinates módszer a MKAnnotation objektumot, és hívja, ha meg akarja változtatni a helyét a kommentár
  3. Hívja regionChanged az egyéni MKAnnotationView, hogy tudassa, ha helyezheti magát (pl MKAnnotation frissült koordináták)
  4. A drawRect a belső nézet objektumot tulajdonában egyéni MKAnnotationView áthelyezheti a koordinátáit MKAnnotation (te, aki olyan utalás).

Lehet valószínűleg egyszerűsíti tovább ezt a megközelítést - lehet, hogy nem igényel belső nézet objektum minden körülmények között.

Válaszolt 15/02/2010 04:45
a forrás felhasználó

szavazat
1

Miután frissítette a koordinátákat vagy más tulajdonságait a kommentár, csak hívja a következő MKMapViewDelegate módszer, hogy dolgozza át a kommentár:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

például:

myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
Válaszolt 04/07/2014 00:51
a forrás felhasználó

szavazat
1

A legtöbb válaszok alapján, hogy a jelölés történt keresztül MKPlacemark kiterjesztése. De mi a helyzet bármilyen más tárgy (azaz egyéni képét marker), amely csak végrehajtja MKAnnotation protokoll? Ez nem lenne setCoordinate módszer. Tehát itt van a válasz alapján kód által 100grams

    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;

így Ön alapvetően kell, hogy a megfelelő MKAnnotationView ami szintén megvalósítani iterációs keresztül minden jegyzetekből és ez az új helyre. Csináltam egy tömb tartó egészet (NSMutableArray * mapAnnotaions), így most tudtam hajtogat csak szeretnék:

for (id annotation in mapAnnotaions) {call refresh method here for id}
Válaszolt 18/07/2012 17:31
a forrás felhasználó

szavazat
1

Ha hivatkozást tartanak a kommentár, hogy a változás, hogy a koordináta-tulajdon, majd adjuk hozzá a kommentár, hogy ismét a térképet, a helyét a kommentár nézet frissül. Nem kell, hogy távolítsa el a kommentár (aminek hatására a kommentár érdekében egy időre eltűnnek). Ez nem kapsz egy szép átmenet, amikor a kommentár koordináta frissítik de. Ugyancsak nem eredményez memóriavesztés sincsenek többszöröse az azonos kommentár felkerült a térképre (ha megnézi száma megjegyzések az mapview, állandó marad, ha újra hozzá a kommentár).

Válaszolt 16/02/2011 14:58
a forrás felhasználó

szavazat
0

A Swift 4.0 és IOS 11.0, én csak hozzá dinamikus attribútum a koordináta tulajdonát gyermek osztályának MKAnnotation osztály és működik: Minden Jegyzetek MapView frissítsék helyét, ha koordináta értékét MKAnnotation tárgyak frissülnek:

class CarAnnotation: NSObject, MKAnnotation {
    @objc dynamic var coordinate: CLLocationCoordinate2D
    //Add your custom code here
}
Válaszolt 15/03/2018 09:30
a forrás felhasználó

szavazat
0

Vessen egy pillantást az én MapKitDragAndDrop minta, ez lehetővé teszi, hogy frissítse MKAnnotation és mozgassa MKAnnotationView mindkét iPhone OS 3 és iOS 4 (használja a beépített húzva támogatás).

Válaszolt 30/06/2010 23:41
a forrás felhasználó

szavazat
-5

Úgy tűnik, nem lehet megváltoztatni a koordináta egy MKAnnotation objektumot, majd tájékoztatja a MKMapView a változás.

Azonban, eltávolítja a korábbi kommentárt a térképen, a változó koordinálja a kommentár objektum és a hozzá vissza a térkép jól működik.

[theMapView removeAnnotation:myAnnotation]; 
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];

Miért nem akarja ezt így?

Válaszolt 13/02/2010 12:53
a forrás felhasználó

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