2013-05-10 6 views
5

के बाद बदलती है मैं एक छोटी परियोजना पर काम कर रहा हूं जो मानचित्र पर 7 विभिन्न प्रकार की टिप्पणियां दिखाती है। मेरी टिप्पणियां सरणी में यूआरएल परिणाम से ली जाती हैं और मैं JSON का उपयोग करके इसे पार्स करता हूं। मेरे पास बहुत सारी टिप्पणियां हैं और मानचित्र लोड होने के बाद सब कुछ अच्छा दिखता है। ज़ूम इन करने और ज़ूम आउट करने के बाद, पिन छवियों को गलत पिन छवि (किसी विशिष्ट छवि, कोई सुराग क्यों नहीं) के कारण किसी कारण से बदलती है।एमकेमैपव्यू एनोटेशन गतिशील पिन छवि ज़ूमिंग

मुझे यकीन है कि मुझे यहां कुछ याद आ रही है ... क्या आप कृपया मदद कर सकते हैं :)?

यहाँ इसके बारे में अब और मेरे कोड का एक हिस्सा है, अगर आप की जरूरत है मुझे पता है:

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

static NSString *identifier; 

if(_mapView.tag==1){identifier = @"TurbulencePin";} 
if(_mapView.tag==2){identifier = @"IcingPin";} 
if(_mapView.tag==3){identifier = @"WindsPin";} 
if(_mapView.tag==4){identifier = @"TemperaturePin";} 
if(_mapView.tag==5){identifier = @"CloudsPin";} 
if(_mapView.tag==6){identifier = @"VisibilityPin";} 
if(_mapView.tag==7){identifier = @"MultiplePin";} 


if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 

if ([annotation isKindOfClass:[Annotation class]]) { 

    CustomAnnotationView* annotationView = (CustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 
    annotationView = nil; 

    if (annotationView == nil) { 

     annotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
     annotationView.enabled = YES; 
     annotationView.canShowCallout = YES; 


     UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",identifier]]; 
     annotationView.image = img; 

    } 
else 
    { 

     annotationView.annotation = annotation; 

    } 


    return annotationView; 

} 
return nil; 

} 

अद्यतन:

दूसरों की प्रतिक्रिया के आधार पर, मैं संशोधित कर लिया है छवि सेटिंग के लिए कोड निम्नानुसार है:

Annotation *myCustomAnn = (Annotation *)annotation; 
NSString *imgName = myCustomAnn.imageName; 
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"%@Pin.png",imgName]]; 
annotationView.image = img; 

return annotationView; 

प्लस, मैं फिर से annotationView = nil;

हालांकि, मैं एनोटेशन.एम में छवि नाम को हार्डकोडेड मान के रूप में सेट नहीं कर सकता क्योंकि मुझे प्रत्येक एनोटेशन के लिए एक अलग पिन छवि प्रदर्शित करने की आवश्यकता है। मुझे यकीन है कि एक स्पष्टीकरण है लेकिन नक्शा के नीचे एनोटेशन.एम से प्राप्त होने वाला एकमात्र मूल्य दृश्य: व्यूफोरएनोटेशन: एनोटेशन निर्देशांक (myCustomAnn.coordinate.latitude और myCustomAnn.coordinate.longitude) है, मुझे कोई संकेत नहीं है कि एनोटेशन से अन्य गुण कैसे प्राप्त करें। मीटर

जैसे शीर्षक अन्य संपत्तियों,, imgname आदि वापस के रूप में अशक्त आता

+0

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

+0

वैसे, मुझे उम्मीद है कि आपके पास एक ही समय में सात मानचित्र खुले नहीं हैं। और यदि आप करते हैं, तो '_mapView' (जो कुछ ivar है) का उपयोग न करें बल्कि इस विधि के पैरामीटर' mapView' का उपयोग करें। – Rob

+1

आपने कहा "एनोटेशन.एम में छवि का नाम सेट नहीं कर सकता ..."। सही बात। आपको एनोटेशन.एम में ऐसा नहीं करना चाहिए। आपकी एनोटेशन में। आपको 'imageName' के लिए बस एक नई संपत्ति परिभाषित करनी चाहिए। फिर एनोटेशन बनाने के बाद आपके कोड में एनोटेशन (आपका व्यू कंट्रोलर?) बनाता है, वहीं आप अपनी एनोटेशन के लिए 'imageName' प्रॉपर्टी सेट करते हैं। आपकी अन्य संपत्तियों के बारे में शून्य होने पर, सवाल यह है कि क्या आप उन गुणों को अपने वीसी में सेट करते हैं, जहां आपने एनोटेशन ऑब्जेक्ट के 'आवंट'/'init' किया था, लेकिन इससे पहले कि आप 'addAnotation' कॉल करें। – Rob

उत्तर

0

एक मुद्दा यह है कि viewForAnnotation क्लास इंस्टेंस वैरिएबल के आधार पर दिखाने के लिए सही छवि का निर्धारण कर रहा है। आम तौर पर एनोटेशन की छवि के लिए पहचानकर्ता कस्टम एनोटेशन की एक संपत्ति होगी, कुछ बाहरी आवृत्ति चर नहीं।

उस पर, ऐसा प्रतीत होता है कि एनोटेशन की सभी संपत्तियों को सेट करने से पहले एनोटेशन मानचित्र में जोड़ा जा रहा था। addAnnotation को तब तक रोकना चाहिए जब तक कि सभी एनोटेशन गुणों को सेट न किया जाए।

वैकल्पिक रूप से, आप एक NSMutableArray में व्याख्या जोड़ने सकते हैं, उन्हें tweak आप मनचाहे ढंग से, और केवल का उपयोग कर addAnnotations (ध्यान दें रों) अंत में एनोटेशन जोड़ने, यह सरणी गुजर।

5

मुख्य समस्या यह है कि viewForAnnotation में कोड एनोटेशन दृश्य निर्धारित करने के लिए बाहर चर _mapView.tag पर भरोसा कर रहा है।

यह यह मानने में असुरक्षित है कि कब और कितनी बार viewForAnnotation प्रतिनिधि विधि द्वारा कॉल किया जाएगा नक्शा।

यदि कोई एनोटेशन का दृश्य कुछ मानों पर निर्भर करता है, तो आमतौर पर एनोटेशन ऑब्जेक्ट में उन मानों को एम्बेड करना सबसे अच्छा होता है। इस तरह, viewForAnnotation प्रतिनिधि विधि में, आप विधि पर पारित annotation पैरामीटर के माध्यम से उन एनोटेशन-विशिष्ट मानों का संदर्भ दे सकते हैं। एनोटेशन बनाने के दौरान उन एनोटेशन-विशिष्ट मानों को सेट किया जाना चाहिए (addAnnotation पर कॉल करने से पहले)।

कुछ और जानकारी और उदाहरण के लिए देखें:

एक अलग मुद्दा कोड dequeueReusableAnnotationViewWithIdentifier जो विपंक्ति धरा बुला के बाद nil करने के लिए annotationView स्थापित कर रही है है।


कम से कम viewForAnnotation में, सही कोड जहां यह संभालती Annotation वर्ग ऐसा दिख सकता है (न कि पूरी विधि - दूसरे if अंदर सिर्फ भाग):

static NSString *identifier = @"ann"; 

CustomAnnotationView* annotationView = (CustomAnnotationView*)[mapView 
    dequeueReusableAnnotationViewWithIdentifier:identifier]; 

//annotationView = nil; // <-- remove this line 

if (annotationView == nil) 
{ 
    annotationView = [[CustomAnnotationView alloc] 
         initWithAnnotation:annotation 
         reuseIdentifier:identifier]; 
    annotationView.enabled = YES; 
    annotationView.canShowCallout = YES; 
} 
else 
{ 
    annotationView.annotation = annotation; 
} 

//MOVE the setting of the image to AFTER the dequeue/create 
//because the image property of the annotation view 
//is based on the annotation and we can update image in one place 
//after both the dequeue and create are done... 

//Get the image name from the annotation ITSELF 
//from a custom property (that you add/set) 
Annotation *myCustomAnn = (Annotation *)annotation; 

NSString *imgName = myCustomAnn.imageName; 
//imageName is the custom property you added/set 

UIImage *img = [UIImage imageNamed: 
        [NSString stringWithFormat:@"%@.png",imgName]]; 

annotationView.image = img; 

return annotationView; 
+1

मैं एनोटेशन गुणों के उपयोग से सहमत हूं। मैं स्ट्रिंग के नाम के बजाय 'enum' एनोटेशन प्रकार पैरामीटर के लिए वोट दूंगा, था। और मैं व्यक्तिगत रूप से प्रत्येक प्रकार के एनोटेशन व्यू के लिए ओपी के कस्टम एनोटेशन आइडेंटिफ़ायर के उपयोग को ध्यान में रखता हूं (चाहे आपको छवि या छवि को रीसेट करने के बजाय, चाहे आपको या नहीं)। साथ ही, मुझे लगता है कि ओपी की 'एनोटेशन व्यू = एनआईएल' की सेटिंग उसके हिस्से पर एक बग नहीं थी, बल्कि लूप के अस्थायी रूप से 'डेक्यू ...' तर्क को लेने के लिए एक जानबूझकर डायग्नोस्टिक प्रक्रिया है, जिससे समस्या को सरल बना दिया जाता है। – Rob

+0

@Rob, मैं आपके सभी बिंदुओं से सहमत हूं। मेरा मुख्य उद्देश्य बाहरी चर के दुरुपयोग को इंगित करना था। – Anna

+0

सहमत हुए। वास्तविक 'mapView' विधि को पारित होने पर' _mapView' ivar को संदर्भित करना विशेष रूप से उत्सुक था। पूर्व-निरीक्षण में, 'टैग' का उपयोग चिंताजनक नहीं है, न केवल उन कारणों के लिए जो आप सही ढंग से इंगित करते हैं, लेकिन यह भी संकेत दे सकता है कि उनके पास सात मानचित्रदृश्य एक ही समय में खुले हैं (जो मुझे सिस्टम संसाधनों के असाधारण उपयोग के रूप में मारता है) । +1 – Rob

0

हल रॉब

समस्या यह थी कि मैं अपने वीसी में निर्धारित एनोटेशन गुणों को पुनः प्राप्त नहीं कर सका। कारण यह था कि मैंने सभी एनोटेशन गुणों को सेट करने से पहले [_mapView addAnnotation:ann]; कमांड का उपयोग किया था। उस ने कहा, इस लाइन को एनोटेशन प्रारंभिक गुण सेटअप के अंतिम भाग में ले जाकर, समस्या हल हो गई।

रॉब के लिए धन्यवाद और बहुत धन्यवाद! मैं अपनी अगली चुनौती पर हूं।

+0

तो क्रेडिट आरओबी में जाता है! –

संबंधित मुद्दे