2011-01-17 18 views
14

मैंने कक्षा से व्युत्पन्न वस्तुओं के एनएसएमयूटेबलएरे को स्थापित किया है जो एमकेएनोटेशन प्रोटोकॉल के अनुरूप है। मैं सेटअप सेटअप शीर्षक और टिप्पणी के लिए उपशीर्षक है और सफलतापूर्वक उपयोग MKMapView करने के लिए उन्हें जोड़ लिया है:एमकेमैप व्यू, एनिमेट्रॉप?

[[self customMapView] addAnnotations:locationArray]; 

क्या मैं अब क्या करना चाहते हैं छोड़ने पिन चेतन है, शुरू में मैंने सोचा था कि मैं कर सकता है कि Option1 साथ , यह सब कुछ काम करता है, लेकिन पिन एनिमेटेड ड्रॉप नहीं करते हैं।

// Option1 
// WORKS FOR: pinColor YES, animatesDrop NO, LABEL YES 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for(MKPinAnnotationView *eachView in views) { 
     [eachView setAnimatesDrop:YES]; 
     [eachView setPinColor:MKPinAnnotationColorPurple]; 
    } 
} 

मेरा अगला अनुमान Option2 कोशिश करने के लिए किया गया था, यह बहुत अच्छी तरह से काम करने के लिए लगता है, लेकिन मैं दो मुद्दे हैं। शीर्षक और उपशीर्षक दिखाई नहीं देते हैं, मेरी कस्टम एनोटेशन ऑब्जेक्ट पास हो रही है (मैं इसे डीबगर में देख सकता हूं) लेकिन इसमें मौजूद जानकारी नए pin पर नहीं जा रही है। दूसरा यह एमकेएनोटेशन व्यू का एक नया सेट बनाता है, पुराने लोगों के साथ क्या होता है, क्या स्मृति मेमोरी लीक के साथ समस्याएं होती हैं?

// Option2 
//FOR: pinColor YES, animatesDrop YES, LABEL NO 
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation { 
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"]; 
    if (pin == nil) { 
     pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease]; 
    } else { 
     pin.annotation = annotation; 
    } 
    pin.pinColor = MKPinAnnotationColorRed; 
    pin.animatesDrop = YES; 
    return pin; 
} 

संपादित करें: मैं pin.canShowCallout = YES;

+1

अपने विकल्प 2 कोड में, जब पिन यह एनोटेशन सेट नहीं होगी बनाई गई है। मैं "else" को हटा दूंगा और pin.annotation = एनोटेशन लाइन इंडेंट करूँगा, ताकि यह हमेशा सेट हो जाए। – theLastNightTrain

उत्तर

32

जोड़ने MKPinAnnotationView MKAnnotationView का एक उपवर्ग है द्वारा गुम शीर्षक & उपशीर्षक समाधान कर लिया है।

एमकेएनोटेशन व्यू एक सामान्य एनोटेशन व्यू है जिसके लिए आपको वांछित छवि और एनीमेशन प्रदान करना होगा।

एमकेपीनएनोटेशन व्यू एमकेएनोटेशन व्यू का एक सुविधाजनक उप-वर्ग है जो स्वचालित रूप से चयनित रंग में पिन छवि प्रदान करता है और मानचित्र पर पिन के एनीमेशन को स्वचालित रूप से प्रदान करता है। देखने में दृश्य बनाते समय एनिमेट्सड्रॉप प्रॉपर्टी सेट करें फोरएनोटेशन और यह एनीमेशन को स्वचालित रूप से वहां से संभाल लेगा।

यदि आप viewForAnnotation को लागू नहीं करते हैं, तो कोई एनीमेशन वाला मानक लाल पिन प्रदर्शित होता है।

उस समय तक ऐडएनोटेशन व्यू कहा जाता है, स्वचालित एनीमेशन पहले ही हो चुका है और उस संपत्ति को सेट करने से कोई प्रभाव नहीं पड़ता है।

यदि आप डिफ़ॉल्ट ड्रॉप एनीमेशन से भिन्न कस्टम एनीमेशन बनाना चाहते हैं, तो MKPinAnnotationView प्रदान करता है, तो आप इसे एडीएडएनोटेशन व्यू में कर सकते हैं। दृश्य पहले से ही अपने अंतिम गंतव्य बिंदु पर होगा ताकि आप इसे सहेज सकें और फिर उसे उस गंतव्य पर किसी भिन्न बिंदु से एनिमेट कर सकें।

यदि आप डिफ़ॉल्ट ड्रॉप एनीमेशन से खुश हैं जो MKPinAnnotationView प्रदान करता है, तो आपको AAddAnnotationViews को लागू करने की आवश्यकता नहीं है। वह प्रतिनिधि विधि अन्य चीजों को करने के लिए अधिक उपयोगी है, जिन्हें आपको करने की आवश्यकता हो सकती है जब सभी एनोटेशन दृश्य वास्तव में होते हैं।

शीर्षक के लिए अपने पिन के लिए, canShowCallout से YES पर सेट करें जहां आप animatesDrop सेट करते हैं।

यह सुनिश्चित नहीं है कि "एमकेएनोटेशन व्यूज़ का एक नया सेट" बनाता है। ViewForAnotation विधि में, आप MKAnotation ऑब्जेक्ट के लिए एक दृश्य (MKPinAnnotationView) प्रदान कर रहे हैं। ये एक ही चीज नहीं हैं।

इसके अलावा, viewForAnnotation विधि जहां एनोटेशन विचारों है, इसीलिए उसे MKAnnotation-विशिष्ट जानकारी को ध्यान में रखते हर बार (जैसे एनोटेशन संपत्ति के रूप में) स्थापित करने के लिए महत्वपूर्ण है पुनर्नवीनीकरण प्राप्त कर सकते हैं UITableView के लिए cellForRowAtIndexPath विधि की तरह काम करता है।

+0

धन्यवाद एक बिट उत्तर, एक सही जवाब। MKAnnotationViews के संबंध में मैं उलझन में था कि अगर आप ViewForAnnotation (जहां आपको डिफ़ॉल्ट लाल पिन मिलते हैं) लागू नहीं करते हैं, तो हो सकता है कि पहले से ही एमकेएएनोटेशन व्यू कहीं भी बनाया गया हो और बाद में इसे लागू करने के बाद मुझे पुराने के साथ कुछ करने की आवश्यकता हो एक। – fuzzygoat

+0

ठीक है, ViewForAnnotation को कार्यान्वित करके, आप डिफ़ॉल्ट दृश्य को ओवरराइड कर रहे हैं इसलिए कोई डुप्लिकेशन नहीं है। – Anna

+0

समझ गया, बहुत सराहना की, बहुत उपयोगी उत्तर के लिए धन्यवाद। – fuzzygoat

11

यहां मुझे सबसे आसान समाधान मिल सकता है। यह क्या करता है UIDapView पर एक सिंगल पिन कोडिडलोड ईवेंट में छोड़ देता है।

  1. परियोजना का संदर्भ MapKit ढांचे

  2. दृश्य है निम्नलिखित आयात: #import <MapKit/MapKit.h>

  3. दृश्य नियंत्रक को लागू MKMapViewDelegate प्रोटोकॉल

  4. दृश्य नियंत्रक कार्यान्वयन में शामिल हैं:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation 
{ 
    MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"]; 
    newAnnotation.pinColor = MKPinAnnotationColorGreen; 
    newAnnotation.animatesDrop = YES; 
    newAnnotation.canShowCallout = NO; 
    [newAnnotation setSelected:YES animated:YES]; 
    return newAnnotation; 
} 
  1. viewDidLoad शामिल हैं:
CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324); 
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil]; 
[mapView addAnnotation:marker]; 
[marker release]; 
+1

देखेंअनुअनोटेशन :, आपको mapView.dequeueReusableAnnotationViewWithIdentifier का उपयोग करना होगा, वैसे ही आप किसी तालिका दृश्य में dequeueReusableCellWithIdentifier का उपयोग करेंगे। अन्यथा, आप एक पुन: उपयोग पहचानकर्ता के साथ एमकेएएनोटेशन बनाते रहें जिन्हें आप वास्तव में पुन: उपयोग नहीं करते हैं। –

+0

आप दृश्य के भीतर एनोटेशन का चयन करेंअनोटेशन जो बेवकूफ लगता है। – Andy

0

अद्यतन Swift3:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

    if annotation is MKUserLocation { 
    return nil 
    } 

    let pinAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "PinAnnotation") 
    pinAnnotation.pinTintColor = .green; 
    pinAnnotation.animatesDrop = true; 
    pinAnnotation.canShowCallout = false; 
    pinAnnotation.setSelected(true, animated: true) 

    return pinAnnotation 
} 
संबंधित मुद्दे