Nasıl haritadan kaldırmadan / eklemeden bir MKAnnotation taşımak için?

oy
31

o ekleme ve haritadan ek açıklama çıkarmadan bir MKAnnotation koordinatı taşımak mümkün mü?

Oluştur 13/02/2010 saat 02:44
kaynak kullanıcı
Diğer dillerde...                            


11 cevaplar

oy
16

Ben oldukça basit bir yöntem buldum. Ben oyuncu ek açıklama yeniden ekleyerek daha sonra kaldırıp olmadan sorunsuz benim oyuncunun pozisyonunu bildirmek istiyoruz. Bu ön iOS4 uygulamalar için iyi çalışır ve ne işe yaradığına hem pimi taşımak ve iğnelerin yeni yeri haritanın merkezi geçerli:

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

Burada aynı şey ama iOS4 için tavsiye blok özelliğini kullanarak açıklanmıştır:

[UIView animateWithDuration:0.5 animations:^{
    [player setCoordinate:aLoc.coordinate];
    [mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
Cevap 05/07/2010 saat 14:47
kaynak kullanıcı

oy
6

Bu çıkarmadan ve ek açıklama dışı kurs eklemeden gerçekten mümkün.

Sen en koordine ve onu değiştirir MKAnnotationView konumunu güncellemek için MKAnnotation gözlemlemek gerekir. Alternatif (ve bu muhtemelen bunu yapmanın daha zarif bir yoludur) Kendi MKAnnotation ve MKAnnotationView türetmek ve onları "hareketli" hale can.

Bkz -MKAnnotationView Hareketli da açıklama konumunu animasyon detaylı örneğin.

Cevap 14/03/2011 saat 16:19
kaynak kullanıcı

oy
4

Alt sınıf MKPointAnnotation ve otomatik olarak yeni koordinatı harita üzerinde açıklama görünümünü güncellemek için yeteneğine sahiptir.

Cevap 26/04/2014 saat 20:17
kaynak kullanıcı

oy
4

Sadece Kvo kullanın:

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

senin MKAnnotation bir setCoordinate yöntemi varsa, sadece orada bu satırları şunlardır:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    [self willChangeValueForKey:@"coordinate"];
    coordinate = newCoordinate;
    [self didChangeValueForKey:@"coordinate"];
}
Cevap 13/03/2012 saat 19:30
kaynak kullanıcı

oy
2

daha genellikle mümkün olup olmadığını biliyorum, ama kendi özel MKAnnotationView varsa öyle yapmayın.

Ben de belgelenmiş yaklaşım adapte edebildi http://spitzkoff.com/craig/?p=108 Craig Spitzkoff tarafından:

  1. Özel MKAnnotationView sizin MKAnnotation nesnesine bir başvuru ver
  2. MKAnnotation nesnesine bir updateCoordinates yöntemi ekleyin ve ek açıklama konumunu değiştirmek istediğinizde diyoruz
  3. kendisini yeniden konumlandırmak için zaman bildirmek için özel MKAnnotationView üzerinde regionChanged Çağrı (örn MKAnnotation koordinatlarını güncelledi zaman)
  4. Eğer MKAnnotation koordinatlarını kullanarak yeniden konumlandırabilirsiniz MKAnnotationView aramaları özel mülkiyetinde iç görünümü nesne üzerinde drawRect (buna bir başvuru tutuyorlar).

Büyük olasılıkla bu yaklaşımı biraz daha basitleştirmek olabilir - her koşulda bir iç görünüm nesnesi gerektirmeyebilir.

Cevap 15/02/2010 saat 04:45
kaynak kullanıcı

oy
1

Koordinatları veya ek açıklama diğer bazı özelliklerini güncellemek sonra, sadece ek açıklamanızı yeniden çizmek için MKMapViewDelegate yöntemini aşağıdaki çağırır:

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

Örneğin:

myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
Cevap 04/07/2014 saat 00:51
kaynak kullanıcı

oy
1

Çoğu yanıtları Ek Açıklama MKPlacemark uzanan yapıldıktan gerçeğine dayanmaktadır. Ama ne sadece MKAnnotation protokolünü uygulayan diğer eşyalar (işaretleyici için yani özel resim) hakkında? Bu setCoordinate yöntemi olmazdı. Yani burada sağlanan koduna göre cevabı, 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;

böylece temelde aynı zamanda ek açıklamaların hepsi aracılığıyla yineleme ile elde edilebilir tekabül MKAnnotationView almak gerekir ve yeni konumuna. Bunun (NSMutableArray * mapAnnotaions) tümü için bir dizi tutucu yapılan bu yüzden şimdi sadece yineleme gibi olabilir:

for (id annotation in mapAnnotaions) {call refresh method here for id}
Cevap 18/07/2012 saat 17:31
kaynak kullanıcı

oy
1

Eğer açıklama referansı tutmak, ek açıklama, görüş konumu güncellenecektir, koordinat özelliğine bir değişiklik, daha sonra tekrar haritaya ek açıklama eklemek olun. Sen (ek açıklama görünümü anlık olarak kaybolmasına neden olacaktır) ek açıklama kaldırmak gerekmez. Bu, ek açıklama Ancak güncellenir koordinat zaman için güzel bir geçiş vermeyecektir. Aynı zamanda bir bellek sızıntısı yol açmaz ne de orada haritaya eklendi Aynı açıklama katları olan (ek açıklamayı yeniden eklediğinizde MapView ek açıklamaları sayısına bakarsak, bu sabit kalır).

Cevap 16/02/2011 saat 14:58
kaynak kullanıcı

oy
0

Swift 4.0 ve IOS 11.0, ben sadece MKAnnotation sınıfının alt sınıfının koordinat özelliğine dinamik niteliğini ekleyip çalışır: MKAnnotation nesnelerin değeri güncellenir koordinat eğer MapView tüm Açıklamalar konumlarını güncelleme:

class CarAnnotation: NSObject, MKAnnotation {
    @objc dynamic var coordinate: CLLocationCoordinate2D
    //Add your custom code here
}
Cevap 15/03/2018 saat 09:30
kaynak kullanıcı

oy
0

Benim bir göz atın MapKitDragAndDrop numunesi, bu (built-in sürükleyerek desteği kullanacağız) Eğer MKAnnotation güncellemek ve her iki iPhone OS 3 ve iOS on 4 MKAnnotationView taşımanıza olanak tanır.

Cevap 30/06/2010 saat 23:41
kaynak kullanıcı

oy
-5

Bir MKAnnotation nesnesinin koordine etmek ve daha sonra değişim MKMapView bilgilendirmek değiştirmek mümkün görünmemektedir.

Ancak, sıra açıklama nesnesinin koordinat değişen ve geriye harita eklemeden, haritadan önceki ek açıklama işleri çıkarmadan.

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

Neden bu şekilde yapmak istemiyorum?

Cevap 13/02/2010 saat 12:53
kaynak kullanıcı

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