2011-11-05 12 views
41

कस्टमाइज़ करें मैं इस छवि में दिखाए गए कस्टम एमकेएएनोटेशन व्यू कॉलआउट बनाना चाहता हूं। मैंने कई समाधानों का परीक्षण किया है लेकिन वे केवल बाएं/दाएं छवियों और शीर्षक/उपशीर्षक के अनुकूलन की अनुमति देते हैं। क्या कोई मुझे इसके लिए कुछ स्रोत कोड या ट्यूटोरियल लिंक दे सकता है?एमकेएएनोटेशन व्यू कॉलआउट

वर्तमान में मैं अनजान हूं। कृपया मदद करे।

enter image description here

+0

मुझे लगता है कि यह एक कस्टम पिन के साथ एक कस्टम दृश्य है, आपकी असली समस्या क्या है? – Mat

+1

बहुत अच्छा सवाल .. यह मुझे भी मदद करता है .. बहुत धन्यवाद जेनिस .. –

+0

नमूना डेमो - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai

उत्तर

49

मैं समझता हूँ कि आप एक कस्टम कॉलआउट के साथ एक पिन चाहते हैं।

हम कस्टम कॉलआउट नहीं बना सकते हैं, लेकिन हम पूरी तरह से अनुकूलित दृश्य के साथ एक एनोटेशन बना सकते हैं। तो चाल पहली बार चुने जाने पर दूसरी एनोटेशन जोड़ना है, और दूसरा एनोटेशन व्यू कॉलआउट बबल की तरह दिखता है। MKAnnotationView - Lock custom annotation view to pin on location updates, जो बारी में एक blog post Asynchrony समाधान से में आधारित है:

यह समाधान उपयोगकर्ताओं djibouti33 और जवाब में jacob-jennings द्वारा पोस्ट की गई है। स्पष्टीकरण उद्देश्यों के लिए, यहां कुछ यूएमएल एक फोर्कड प्रोजेक्ट से है: Annotation with custom XIB

यह एक बड़ा हैक है, लेकिन कस्टम एनोटेशन को लागू करने के लिए मैंने सबसे साफ तरीका भी देखा है।

एनएसओब्जेक्ट "सामग्री" कक्षा के साथ प्रारंभ करें जिसमें समन्वय है, कॉलआउट दृश्य का वर्ग उपयोग करने के लिए (यूएमएल में एनोटेशन व्यू है, लेकिन आप अधिक बना सकते हैं और उन्हें यहां सेट कर सकते हैं), और यादृच्छिक मानों का एक शब्दकोश शीर्षक, फोटो यूआरएल, आदि। इस वर्ग का उपयोग एमकेएएनोटेशन "एनोटेशन" ऑब्जेक्ट को शुरू करने के लिए करें।

#import <MapKit/MapKit.h> 
@interface Content : NSObject 
@property (nonatomic,assign) CLLocationCoordinate2D coordinate; 
// ... 

@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol> 
-(id) initWithContent:(Content*)content; 
// ... 

एनोटेशन यह अपने आप ही MKAnnotationView के निर्माण को संभालने के लिए चाहता है की घोषणा करने के AnnotationProtocol लागू करता है। यही कारण है, अपने MKMapViewDelegate इस तरह कोड होना चाहिए:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    // if this is a custom annotation, delegate the implementation of the view 
    if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) { 
     return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView]; 
    } else { 
     // else, return a standard annotation view 
     // ... 
    } 
} 

दृश्य लौटे प्रकार AnnotationView, जो AnnotationViewProtocol लागू करता है की घोषणा करते हुए यह चयन/अचयन को संभालने के लिए चाहता है के लिए किया जाएगा। इसलिए, अपने मानचित्र में नियंत्रक देखें, विधियों का नक्शा दृश्य: किया गया चयन करें नोट: और नक्शा दृश्य: didDeselectAnnotationView: जैसा हमने पहले देखा था उसी तरह से प्रतिनिधि होना चाहिए।

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

CalloutView वर्ग के प्रारंभकर्ता:

- (id)initWithAnnotation:(CalloutAnnotation*)annotation 
{ 
    NSString *identifier = NSStringFromClass([self class]); 
    self = [super initWithAnnotation:annotation reuseIdentifier:identifier]; 
    if (self!=nil){ 
     [[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil]; 
     // prevent the tap and double tap from reaching views underneath 
     UITapGestureRecognizer *tapGestureRecognizer = ... 
    } 
    return self; 
} 

कॉलआउट दृश्य मैं सूचनाओं का इस्तेमाल किया से एक और दृश्य नियंत्रक पुश करने के लिए सक्षम होने के लिए।

शीर्ष पर लिंक किए गए SO उत्तर में इस कोड को लागू करने वाली दो पूर्ण परियोजनाएं शामिल हैं (कक्षा के नाम भिन्न हो सकते हैं)। मेरे पास U12 का उपयोग https://github.com/j4n0/callout पर एक और प्रोजेक्ट है।

+0

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

+0

हां, यह ज्ञात है, समाधान के लिए https://github.com/j4n0/callout/issues/1 देखें। – Jano

+0

मुझे इस कोड को लागू करने में समस्या का सामना करना पड़ रहा है कोई भी मेरी मदद कर सकता है .. –

0

मैंने एमकेएनोटेशन व्यू में कस्टम UIButton जोड़ा। और उस बटन के क्लिक पर मैंने रूटव्यू कंट्रोलर के साथ popOver दिखाया है जैसा कि आपने उपरोक्त दिखाया है।

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

  • कोई संबंधित समस्या नहीं^_^