2011-06-23 13 views
6

मेरे पास एक नक्शाकिट ऐप है जो मानचित्र पर टिप्पणियां रखता है, जब आप उन्हें दबाते हैं, तो यह शीर्षक विशेषता के साथ कॉलआउट दिखाता है।मानचित्र को टैप करके आईओएस मैपकिट एनोटेशन कॉलआउट बंद करना

यह ठीक काम करता है, लेकिन उपयोगकर्ता उन्हें बंद नहीं कर सकता है। वे तब तक खुले रहते हैं जब तक कि वे एक और टिप्पणी न करें। क्या मैं इसे बंद नहीं कर सकता हूं कि उपयोगकर्ता इसे बंद करने के लिए मानचित्र पर अन्यथा टैप कर सकता है (या फिर एनोटेशन टैप कर सकता है)?

मुझे लगा कि यह डिफ़ॉल्ट सेटिंग थी, तो शायद मैं जो कुछ कर रहा हूं वह इसे भर रहा है?

- (void)handleTap:(UITapGestureRecognizer *)sender {  
if (sender.state == UIGestureRecognizerStateEnded) { 


    CGPoint tapPoint = [sender locationInView:sender.view.superview]; 
    CLLocationCoordinate2D coordinate = [self.mapView convertPoint: tapPoint toCoordinateFromView: self.mapView]; 

    if (pitStopMode && !pitStopMade){ 
      pitStopMade = YES; 
     InfoAnnotation *annotation = [[InfoAnnotation alloc] 
         initNewPitstopWithCoordinate:coordinate]; 
     NSLog(@" Created Pit Stop"); 

     annotation.draggable = NO; 
     //place it on the map 
     [self.mapView addAnnotation: annotation]; 

     self.instructionLabel.text = @"Tap button again to remove"; 
     annotation.creatorId = self.localUser.deviceId; 
     //send it to the server 
     [annotation updateLocationWithServerForConvoy: self.convoyCode];   

     [annotation release]; 

    } 

    if (hazardMode && !hazardMade){ 
      hazardMade = YES; 
     InfoAnnotation *annotation = [[InfoAnnotation alloc] 
         initNewHazardWithCoordinate:coordinate];   
     NSLog(@" Created Hazard"); 

     annotation.draggable = NO; 
     //place it on the map 
     [self.mapView addAnnotation: annotation]; 

     self.instructionLabel.text = @"Tap button again to remove"; 
     annotation.creatorId = self.localUser.deviceId; 
     //send it to the server 
     [annotation updateLocationWithServerForConvoy: self.convoyCode];   

     [annotation release]; 


    } 
} 

}

क्या मैं भी इन नल के माध्यम से जाना जाने के लिए क्या करना है है: मैं जो मैं कुछ नक्शे पर टैप

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleTap:)]; 
tap.numberOfTapsRequired = 1; 

[self.mapView addGestureRecognizer: tap]; 

जो इस आग का पता लगाने के लिए उपयोग एक इशारा पहचानकर्ता है मानचित्रदृश्य के लिए? एनोटेशन पर ड्रैगिंग और टैपिंग ठीक काम करती है, इसलिए मुझे यकीन नहीं है कि यह क्या कारण है?

क्या कोई विकल्प है जो मुझे याद आ रहा है, या क्या मुझे इसे मैन्युअल रूप से आजमाने और कार्यान्वित करना है?

उत्तर

10

आप UIGestureRecognizerDelegate विधि gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: को लागू करने और YES वापसी (ताकि मानचित्र दृश्य के अपने टैप जेस्चर पहचानकर्ता के रूप में अच्छी तरह से अपनी विधि निष्पादित करेंगे) कर सकते हैं।

पहले, अपने दृश्य नियंत्रक के इंटरफ़ेस करने के लिए प्रोटोकॉल घोषणा जोड़ें (एक संकलक चेतावनी से बचने के लिए):, अंत में

tap.delegate = self; 

:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate> 

इसके बाद, इशारा पहचानकर्ता पर delegate गुण सेट विधि को कार्यान्वित करें:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer: 
     (UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 



अगर वह किसी कारण से काम नहीं करता है, तो आप वैकल्पिक रूप से किसी भी वर्तमान में चयनित एनोटेशन मैन्युअल handleTap: विधि के शीर्ष पर डी-सेलेक्ट कर सकते हैं:

for (id<MKAnnotation> ann in mapView.selectedAnnotations) { 
    [mapView deselectAnnotation:ann animated:NO]; 
} 

हालांकि मानचित्र दृश्य केवल की एक अधिकतम की अनुमति देता है एक समय में एक एनोटेशन का चयन किया जाना चाहिए, selectedAnnotations संपत्ति NSArray है इसलिए हम इसके माध्यम से लूप करते हैं।

0

अन्ना अच्छी व्याख्या करती है। साथ ही मैं बिल्कुल कोड के साथ समझाऊंगा। आप इस

 UITapGestureRecognizer *tapMap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeCallout:)]; 
     [self.mapView addGestureRecognizer:tapMap]; 

-(void) closeCallout:(UIGestureRecognizer*) recognizer 
     { 
      for (id<MKAnnotation> ann in mapView.selectedAnnotations) 
      { 
       [mapView deselectAnnotation:ann animated:NO]; 
      }  


     } 
की तरह कर सकते हैं
संबंधित मुद्दे