o ekleme ve haritadan ek açıklama çıkarmadan bir MKAnnotation koordinatı taşımak mümkün mü?
Nasıl haritadan kaldırmadan / eklemeden bir MKAnnotation taşımak için?
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];
}];
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.
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.
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"];
}
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:
- Özel MKAnnotationView sizin MKAnnotation nesnesine bir başvuru ver
- MKAnnotation nesnesine bir updateCoordinates yöntemi ekleyin ve ek açıklama konumunu değiştirmek istediğinizde diyoruz
- kendisini yeniden konumlandırmak için zaman bildirmek için özel MKAnnotationView üzerinde regionChanged Çağrı (örn MKAnnotation koordinatlarını güncelledi zaman)
- 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.
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];
Ç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}
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).
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
}
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.
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?













