2013-05-12 6 views
5

मेरे MKPointAnnotation इस कोड के साथ कस्टम होना चाहिए:मेरा एमकेपॉइंट नोटेशन कस्टम क्यों नहीं है?

-(MKPointAnnotation*)setAnnotation: (NSString*) title atLocation:(CLLocationCoordinate2D)Location withImage:(UIImage*) LocationImage{ 
    Pin = [[MKPointAnnotation alloc] init]; 
    Pin.title = title; 
    [Pin setCoordinate:Location]; 
    [self mapView:mapView viewForAnnotation:Pin].annotation = Pin; 
    return Pin; 
} 



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

     MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"]; 


     if(!pinView){ 
      pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"]; 
      pinView.animatesDrop = YES; 
      pinView.canShowCallout = YES; 
      pinView.enabled = YES; 
      UIButton *PicButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      [PicButton addTarget:self action:@selector(showLocationPicture) forControlEvents:UIControlEventTouchUpInside];\ 
      pinView.rightCalloutAccessoryView = PicButton; 
     } 
     else{ 
      pinView.annotation = annotation; 
     } 
    return pinView; 
} 

फिर भी, किसी कारण से, पिन अभी भी लागू हो रहा है, किसी को भी मुझे यहाँ मदद कर सकते हैं? धन्यवाद

उत्तर

10

आपको viewForAnnotation स्वयं को कॉल नहीं करना चाहिए। आपको केवल अपने मानचित्र दृश्य में एनोटेशन जोड़ना चाहिए, जो तब निर्धारित करेगा कि किसी भी क्षण में कौन सा दिखाई दे रहा है और आपके लिए viewForAnnotation पर कॉल करें। इस प्रकार:

  • को देखते हुए विभिन्न एनोटेशन विभिन्न छवियों हो सकता है, तुम सच में MKPointAnnotation उपवर्ग और यह imageName (ध्यान दें, नहीं UIImage ही एक संपत्ति देना चाहते हैं, लेकिन एक नाम या पहचानकर्ता कि viewForAnnotation में सक्षम हो जाएगा UIImage ही बनाने के लिए) का उपयोग करें:

    @interface MyAnnotation : MKPointAnnotation 
    @property(nonatomic, strong) NSString *imageName; 
    @end 
    
    @implementation MyAnnotation 
    @end 
    
  • जैसे अपने MapView में एक टिप्पणी (नहीं एक टिप्पणी के दृश्य) जोड़े,:

    - (id<annotation>)addAnnotationWithTitle:(NSString *)title coordinate:(CLLocationCoordinate2D)coordinate imageName:(NSString *)imageName 
    { 
        MyAnnotation *annotation = [[MyAnnotation alloc] init]; 
        annotation.title = title; 
        annotation.coordinate = coordinate; 
        annotation.imageName = imageName; 
        [mapView addAnnotation:annotation]; 
        return annotation; 
    } 
    

    ध्यान दें, मैं Pin एक वर्ग इवर/संपत्ति बनाने का सुझाव नहीं होता है, और मैं चर नाम के लिए केमलकेस का उपयोग करेंगे (लोअरकेस के साथ शुरू), मैं विधि नाम setAnnotation से कुछ करने के लिए addAnnotationWithTitle, आदि जैसे बदल देंगे

  • सुनिश्चित करें कि आपका नियंत्रक मानचित्र दृश्य के प्रतिनिधि के रूप में निर्दिष्ट किया गया है;

  • viewForAnnotation आपके लिए बुलाया जाएगा (यदि एनोटेशन दिखाई दे रहा है)। यह शायद कुछ ऐसा होना चाहिए:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
    { 
        if ([annotation isKindOfClass:[MKUserLocation class]]) 
         return nil; 
    
        if ([annotation isKindOfClass:[MyAnnotation class]]) 
        { 
         MyAnnotation *customAnnotation = annotation; 
    
         static NSString *annotationIdentifier = @"MyAnnotation"; 
         MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 
         if (!annotationView) 
         { 
          annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier]; 
          annotationView.canShowCallout = YES; 
          annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
         } 
         else 
         { 
          annotationView.annotation = annotation; 
         } 
    
         annotationView.image = [UIImage imageNamed:customAnnotation.imageName]; 
    
         return annotationView; 
        } 
    
        return nil; 
    } 
    

    ध्यान दें, animatesDrop एक MKPinAnnotationView विकल्प है कि आप कस्टम एनोटेशन विचारों के साथ ऐसा नहीं कर सकते है। लेकिन यदि आप इसे चाहते हैं तो इसे लागू करना आसान है (How can I create a custom "pin-drop" animation using MKAnnotationView? देखें)। मेरा सुझाव है कि आप पहले मूल एनोटेशन व्यू से निपटें, और फिर बाद में कस्टम एनोटेशन व्यू ड्रॉप एनीमेशन देखें।

+0

लेकिन फिर मैं एनोटेशन के लिए सेटिंग्स कैसे समायोजित करूं? क्योंकि अभी मैं चीजों का उपयोग करता हूं जैसे: pinView.rightCalloutAccessoryView = PicButton; लेकिन यह –

+0

@BlackMagic काम नहीं करता है और अधिक पूर्ण कोड नमूना के साथ मेरा संशोधित उत्तर देखें। – Rob

+1

आपको बहुत बहुत धन्यवाद, यही वही था जो मुझे चाहिए था। –

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