Je možné přesunout souřadnici MKAnnotation bez přidávání a odebírání anotaci z mapy?
Jak přesunout MKAnnotation bez přidání / vyjmutí z mapy?
Našel jsem docela jednoduchou metodu. Chtěl jsem aktualizovat pozici mé hráče hladce bez odebrání a potom znovu přidat anotaci hráče. To funguje dobře pro pre-iOS4 aplikací, a to, co dělá, je tak přesunout kolík a střed mapy na nové místo kolíku je:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];
Zde je totéž, ale s použitím doporučeného bloku funkci pro iOS4:
[UIView animateWithDuration:0.5 animations:^{
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
Je skutečně možné bez demontáže a přidáním anotace off-kurzu.
Budete muset sledovat svou MKAnnotation je koordinovat a aktualizovat pozici MKAnnotationView, když se změní. Případně můžete (a to je pravděpodobně více elegantní způsob, jak to udělat) odvozují svůj vlastní MKAnnotation a MKAnnotationView a učinit je „pohyblivá“.
Viz Moving-MKAnnotationView podrobný příklad, který také oživuje pozici anotace.
Podtřídy MKPointAnnotation a má schopnost aktualizovat zobrazení anotací na mapě nová souřadnic automaticky.
Stačí použít Kvo:
[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];
Pokud váš MKAnnotation má metodu setCoordinate, jen zahrnout tyto řádky přímo zde:
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
[self willChangeValueForKey:@"coordinate"];
coordinate = newCoordinate;
[self didChangeValueForKey:@"coordinate"];
}
Nevím, zda je to obecně možné, ale to je, pokud máte svůj vlastní MKAnnotationView.
Byl jsem schopen se přizpůsobit přístupu dokumentované v http://spitzkoff.com/craig/?p=108 Craig Spitzkoff:
- Dejte vlastnímu MKAnnotationView odkaz na vaši MKAnnotation objektu
- Přidat metodu updateCoordinates k objektu MKAnnotation a volat, když chcete změnit umístění anotace
- Zavolat regionChanged na vlastní MKAnnotationView nechat vědět, kdy přemístit sebe (například při MKAnnotation aktualizovala souřadnic)
- V drawRect na objekt vnitřní pohled ve vlastnictví vaší vlastní MKAnnotationView můžete přemístit pomocí souřadnic MKAnnotation (držíte odkaz na něj).
Tento přístup Dalo by se pravděpodobně zjednodušit dále - nemusí vyžadovat vnitřní objekt zobrazení za všech okolností.
Po aktualizaci souřadnic nebo některé jiné vlastnosti anotace, stačí zavolat následující metody MKMapViewDelegate překreslení anotaci:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
např:
myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
Většina odpovědi jsou založeny na tom, že vaše anotace bylo vyrobeno přes MKPlacemark prodloužení. Ale co jiného předmětu (tj zakázku obrazu pro značku), který implementuje pouze MKAnnotation protokol? To nebude mít metodu setCoordinate. Tak tady je odpověď na základě kódu, pokud by 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;
Takže jste v podstatě muset získat odpovídající MKAnnotationView, které by mohly být také dosaženo iteraci přes všechny poznámky a je to nové umístění. Udělal jsem držitele pole pro všechno (NSMutableArray * mapAnnotaions), takže teď můžu opakovat stejně jako:
for (id annotation in mapAnnotaions) {call refresh method here for id}
Pokud se budete držet odkaz na vaši anotace, aby ke změně souřadnic majetku, poté znovu přidat poznámky do mapy, umístění pohledu anotace bude aktualizovat. Nemusíte odstranit anotaci (což způsobí zobrazení anotace na okamžik zmizí). To nebude vám pěkný přechod pro případ, kdy koordinovat anotace je však aktualizován. To také nemá za následek únik paměti ani zde nejsou násobkem stejné anotace přidané do mapy (když se podíváte na počtu anotací na MapView, zůstává konstantní, když se znovu přidat anotace).
V Swift 4.0 a IOS 11.0, jen jsem přidat atribut dynamic na souřadnicovém majetku dítěte třídy třídy MKAnnotation a funguje to: Všechny poznámky na MapView aktualizovat svou polohu, pokud hodnota souřadnice objektů MKAnnotation jsou aktualizovány:
class CarAnnotation: NSObject, MKAnnotation {
@objc dynamic var coordinate: CLLocationCoordinate2D
//Add your custom code here
}
Podívejte se na mé MapKitDragAndDrop vzorku, to vám umožní aktualizovat MKAnnotation a přesunout MKAnnotationView na obou iPhone OS 3 a iOS 4 (bude používat vestavěný přetahování podpory).
To se nezdá být možné změnit souřadnici objektu MKAnnotation a poté informovat MKMapView změny.
Nicméně, odstranění předchozí anotaci z mapy, změna souřadnic vaší anotace předmětu a přidá zpět do mapy funguje dobře.
[theMapView removeAnnotation:myAnnotation];
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];
Proč nechceš dělat to takhle?













