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?
Hogyan lehet mozgatni egy MKAnnotation nélkül hozzáadása / eltávolítása a térképről?
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];
}];
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.
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.
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"];
}
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:
- Adjon egyéni MKAnnotationView hivatkozni a MKAnnotation objektum
- Adjunk hozzá egy updateCoordinates módszer a MKAnnotation objektumot, és hívja, ha meg akarja változtatni a helyét a kommentár
- Hívja regionChanged az egyéni MKAnnotationView, hogy tudassa, ha helyezheti magát (pl MKAnnotation frissült koordináták)
- 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.
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];
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}
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).
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
}
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).
Ú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?













