इसे जोड़ने और नक्शे से एनोटेशन निकाले बिना स्थानांतरित करने के लिए एक MKAnnotation की समन्वय संभव है?
कैसे जोड़ने / मानचित्र से इसे हटाने के बिना एक MKAnnotation स्थानांतरित करने के लिए?
मैं एक बहुत ही सरल तरीका मिल गया। मैं दूर करने और फिर खिलाड़ी एनोटेशन फिर से जोड़ने के बिना सुचारू रूप से मेरी खिलाड़ी की स्थिति को अद्यतन करना चाहता था। इससे इस बीमारी के iOS4 क्षुधा के लिए अच्छी तरह से काम करता है, तथा उसके द्वारा दोनों पिन ले जाने और पिन के नए स्थान पर केंद्रित है:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];
यहाँ एक ही बात लेकिन iOS4 के लिए सिफारिश की ब्लॉक सुविधा का उपयोग कर सकते हैं:
[UIView animateWithDuration:0.5 animations:^{
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
यह दूर करने और एनोटेशन ऑफ कोर्स जोड़े बिना वास्तव में संभव है।
आप के समन्वय और MKAnnotationView की स्थिति बदलने पर अपडेट करें अपने MKAnnotation निरीक्षण करने के लिए की आवश्यकता होगी। वैकल्पिक रूप से आप कर सकते हैं (और यह शायद यह कर के और अधिक सुरुचिपूर्ण तरीका है) अपनी MKAnnotation और MKAnnotationView निकाले जाते हैं और उन्हें "चल" बनाते हैं।
देखें आगे बढ़ते-MKAnnotationView एक विस्तृत उदाहरण जो भी व्याख्या की स्थिति एनिमेट होने के लिए।
उपवर्ग MKPointAnnotation और यह नया करने के लिए नक्शे पर एनोटेशन दृश्य को अपडेट करें स्वचालित रूप से समन्वय स्थापित क्षमता है।
बस KVO का उपयोग करें:
[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];
अपने MKAnnotation एक setCoordinate विधि है, तो बस इन लाइनों वहीं शामिल हैं:
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
[self willChangeValueForKey:@"coordinate"];
coordinate = newCoordinate;
[self didChangeValueForKey:@"coordinate"];
}
चाहे वह अधिक आम तौर पर संभव है पता नहीं है, लेकिन यह है कि अगर आप अपने स्वयं के कस्टम MKAnnotationView है।
मैं दृष्टिकोण में प्रलेखित अनुकूलन करने में सक्षम था http://spitzkoff.com/craig/?p=108 क्रेग Spitzkoff द्वारा:
- अपने कस्टम MKAnnotationView अपने MKAnnotation ऑब्जेक्ट के संदर्भ दें
- MKAnnotation वस्तु के लिए एक updateCoordinates पद्धति जोड़ें और इसे कहते हैं जब आप एनोटेशन के स्थान को बदलना चाहते हैं
- कस्टम MKAnnotationView पर regionChanged कॉल यह पता ही स्थिति बदलने के लिए जब जाने के लिए (जैसे MKAnnotation निर्देशांक अपडेट किया गया है जब)
- अपने कस्टम MKAnnotationView आप MKAnnotation के निर्देशांकों का प्रयोग स्थान बदल सकते हैं के स्वामित्व में आंतरिक दृश्य वस्तु पर drawRect में (आप इसे करने के लिए एक संदर्भ रोक रखी है)।
आप की संभावना इस दृष्टिकोण आगे सरल सकता है - आप सभी परिस्थितियों में एक आंतरिक दृश्य वस्तु की आवश्यकता नहीं हो सकता है।
आप निर्देशांक या एनोटेशन के कुछ अन्य गुण अपडेट करने के बाद, बस MKMapViewDelegate विधि निम्नलिखित अपनी एनोटेशन पुनः बनाने का फोन:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
उदाहरण के लिए:
myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
अधिकांश जवाब तथ्य यह है कि अपने एनोटेशन MKPlacemark विस्तार के माध्यम से किया गया है पर आधारित हैं। लेकिन क्या किसी अन्य वस्तु (मार्कर के लिए यानी कस्टम छवि) जो केवल MKAnnotation प्रोटोकॉल लागू करता है के बारे में? यह setCoordinate विधि नहीं होती। तो यहाँ द्वारा प्रदान की जवाब कोड के आधार पर, है 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;
तो आप मूल रूप से इसी MKAnnotationView जो भी एनोटेशन के सभी के माध्यम से यात्रा के द्वारा प्राप्त किया जा सकता प्राप्त करने की आवश्यकता है और यह नए स्थान है। मैं इसे (NSMutableArray * mapAnnotaions) के सभी के लिए एक सरणी धारक बना तो अब मैं बस पुनरावृति की तरह कर सकते हैं:
for (id annotation in mapAnnotaions) {call refresh method here for id}
अगर आप अपनी टिप्पणी के लिए एक संदर्भ रखना, तो एनोटेशन देखने का स्थान अपडेट करेगा, संपत्ति का समन्वय करने के लिए एक बदलाव है, तो फिर से नक्शा करने के लिए टिप्पणी जोड़ने के बनाते हैं। आप एनोटेशन (जो एनोटेशन दृश्य क्षण भर गायब करने का कारण होगा) को हटाने की जरूरत नहीं है। इससे आपको एनोटेशन समन्वय हालांकि अद्यतन किया जाता है के लिए एक अच्छी संक्रमण नहीं देंगे। यह भी एक स्मृति रिसाव नहीं होती तो संभव है और न ही वहाँ एक ही एनोटेशन मानचित्र में जुड़ना की एक बहु हैं (यदि आप MapView पर भी टिप्पणियां की संख्या को देखो, यह है जब आप एनोटेशन फिर से जोड़ निरंतर बनी हुई)।
स्विफ्ट 4.0 और आईओएस 11.0 में, मैं सिर्फ MKAnnotation वर्ग के बच्चे वर्ग के समन्वय संपत्ति को गतिशील विशेषता जोड़ सकते हैं और यह काम करता है: MapView पर सभी एनोटेशन अपने स्थान को अपडेट करता है, तो समन्वय MKAnnotation वस्तुओं के मूल्य अपडेट किया जाता है:
class CarAnnotation: NSObject, MKAnnotation {
@objc dynamic var coordinate: CLLocationCoordinate2D
//Add your custom code here
}
मेरे पर एक नजर डालें MapKitDragAndDrop नमूना है, यह (का उपयोग करेगा निर्मित खींच समर्थन) आप MKAnnotation को अद्यतन करने और दोनों iPhone OS 3 और iOS 4 पर MKAnnotationView स्थानांतरित करने के लिए अनुमति देता है।
यह एक MKAnnotation वस्तु का समन्वय और फिर परिवर्तन की MKMapView सूचित बदलना संभव नहीं लगता है।
हालांकि, अच्छी तरह से नक्शे से पिछले एनोटेशन को दूर करने, बदल रहा है अपनी एनोटेशन वस्तु का समन्वय है और इसे वापस मानचित्र में जोड़ने काम करता है।
[theMapView removeAnnotation:myAnnotation];
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];
क्यों नहीं है तो आप इसे इस तरह से करना चाहते हैं?













