2010-08-03 13 views
22

मैं एमकेमैप व्यू और एमकेएनोटेशन व्यू के साथ काम कर रहा हूं।एमकेएनोटेशन में कॉलआउटबबल पर टैप का पता लगाएं

मेरे पास मानचित्र में एक टिप्पणी है। जब उपयोगकर्ता इसे टैप करते हैं, तो कॉलऑट बबल प्रदर्शित होता है। जब एनोटेशन दोबारा टैप किया जाता है (और कॉलऑट बबल दिखाई देता है) मुझे दूसरे दृश्य में बदलने की जरूरत है।

मैं दूसरी टैप या बुलबुले में टैप का पता कैसे लगा सकता हूं?

+0

क्या आपको समाधान मिला है? –

+3

सरल तरीका है बटन को दाएं कॉलआउट एक्सेसरीव्यूव्यू के रूप में सेट करना और कॉलआउट एक्सेसरीकंट्रोल टैप करें। क्या यह पर्याप्त नहीं है या आपको शीर्षक और उपशीर्षक पर नलियां भी पकड़नी चाहिए? – Anna

उत्तर

10

क्या आप MKAnnotationView प्रारंभ कर रहे हैं जब आप एक इशारा पहचानकर्ता जोड़ सकते हैं?

यहाँ अंदर dequeueReusableAnnotationViewWithIdentifier:

UITapGestureRecognizer *tapGesture = 
     [[UITapGestureRecognizer alloc] initWithTarget:self 
             action:@selector(calloutTapped:)]; 
[theAnnotationView addGestureRecognizer:tapGesture]; 
[tapGesture release]; 

इशारा पहचानकर्ता के लिए विधि के लिए कोड है:

-(void) calloutTapped:(id) sender { 
    // code to display whatever is required next. 

    // To get the annotation associated with the callout that caused this event: 
    // id<MKAnnotation> annotation = ((MKAnnotationView*)sender.view).annotation; 
} 
+4

कॉलआउट एनोटेशन व्यू के समान नहीं है। कॉलआउट वह बबल है जो तब दिखाई देता है जब आप कॉलआउट व्यू टैप करते हैं। – shim

+6

मैंने मानचित्र में जेस्चर रिकॉग्नाइज़र जोड़ा है व्यू: didSelectAnnotationView: विधि और यह समाधान मेरे लिए पूरी तरह से काम करता है। –

+0

@DanielT। आप एमवीपी: पी –

6

कॉल आउट बटन को टैप करने के लिए के बाद उपयोगकर्ता एनोटेशन देखने पर क्लिक किया गया है, में एक UITapGestureRecognizer जोड़ने didSelectAnnotationView। इस तरह आप एक्सेसरी दृश्यों की आवश्यकता के बिना कॉलआउट पर टैप लागू कर सकते हैं।

फिर आप आगे की कार्रवाई के लिए प्रेषक से एनोटेशन ऑब्जेक्ट वापस प्राप्त कर सकते हैं।

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(calloutTapped:)]; 
    [view addGestureRecognizer:tapGesture]; 
} 

-(void)calloutTapped:(UITapGestureRecognizer *) sender 
{ 
    NSLog(@"Callout was tapped"); 

    MKAnnotationView *view = (MKAnnotationView*)sender.view; 
    id <MKAnnotation> annotation = [view annotation]; 
    if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
    { 
     [self performSegueWithIdentifier:@"annotationDetailSegue" sender:annotation]; 
    } 
} 
+2

इस समाधान से सावधान रहें। यहां समस्या यह है कि जब भी आप एनोटेशन चुनते हैं तो आप एक टैप इशारा करते हैं ताकि आपको कई नलियां बनाने के साथ समस्या हो सकती है उदाहरण के लिए यदि आप इसे चुनते हैं, इसे अचयनित करें और इसे दोबारा संशोधित करें। मुझे लगता है कि एनोटेशन व्यू प्रारंभ में एक टैप इशारा जोड़ना बेहतर है या अस्थिरता – Beninho85

4

UIButtonTypeDetailDisclosure प्रकार को बदले बिना बटन के लिए कस्टम छवि सेट करने का प्रयास करें।

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { 
    let gesture = UITapGestureRecognizer(target: self, action: #selector(MyMapViewController.calloutTapped(_:))) 
    view.addGestureRecognizer(gesture) 
} 

func calloutTapped(sender:UITapGestureRecognizer) { 
    guard let annotation = (sender.view as? MKAnnotationView)?.annotation as? MyAnnotation else { return } 

    selectedLocation = annotation.myData 
    performSegueWithIdentifier("mySegueIdentifier", sender: self) 
} 
+1

पर इशारा हटाने को संभालना बेहतर है! इतनी दुखी है कि इस तरह की चीजें एपीआई में कहीं भी दस्तावेज नहीं हैं-.- – Cabus

6

यहाँ अगले दृश्य नियंत्रक को पारित करने के लिए चयनित आइटम से हो रही डेटा सहित धनु के जवाब की तेज संस्करण, है। आपको rightCalloutAccessoryView

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    switch annotation { 
    case let annotation as Annotation: 
    let view: AnnotationView = mapView.dequeue(annotation: annotation) 
    view.canShowCallout = true 
    let button = UIButton(type: .detailDisclosure) 
    button.on.tap { [weak self] in 
     self?.handleTap(annotation: annotation) 
    } 
    view.rightCalloutAccessoryView = button 
    return view 
    default: 
    return nil 
    } 
} 
0

स्विफ्ट 3, On का उपयोग कर:

UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];   
[detailButton setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal]; 
संबंधित मुद्दे