Jak přesunout MKAnnotation bez přidání / vyjmutí z mapy?

hlasů
31

Je možné přesunout souřadnici MKAnnotation bez přidávání a odebírání anotaci z mapy?

Položena 13/02/2010 v 02:44
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
16

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];
}];
Odpovězeno 05/07/2010 v 14:47
zdroj uživatelem

hlasů
6

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.

Odpovězeno 14/03/2011 v 16:19
zdroj uživatelem

hlasů
4

Podtřídy MKPointAnnotation a má schopnost aktualizovat zobrazení anotací na mapě nová souřadnic automaticky.

Odpovězeno 26/04/2014 v 20:17
zdroj uživatelem

hlasů
4

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"];
}
Odpovězeno 13/03/2012 v 19:30
zdroj uživatelem

hlasů
2

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:

  1. Dejte vlastnímu MKAnnotationView odkaz na vaši MKAnnotation objektu
  2. Přidat metodu updateCoordinates k objektu MKAnnotation a volat, když chcete změnit umístění anotace
  3. Zavolat regionChanged na vlastní MKAnnotationView nechat vědět, kdy přemístit sebe (například při MKAnnotation aktualizovala souřadnic)
  4. 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í.

Odpovězeno 15/02/2010 v 04:45
zdroj uživatelem

hlasů
1

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];
Odpovězeno 04/07/2014 v 00:51
zdroj uživatelem

hlasů
1

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}
Odpovězeno 18/07/2012 v 17:31
zdroj uživatelem

hlasů
1

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

Odpovězeno 16/02/2011 v 14:58
zdroj uživatelem

hlasů
0

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
}
Odpovězeno 15/03/2018 v 09:30
zdroj uživatelem

hlasů
0

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

Odpovězeno 30/06/2010 v 23:41
zdroj uživatelem

hlasů
-5

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?

Odpovězeno 13/02/2010 v 12:53
zdroj uživatelem

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