2011-12-27 13 views
8

वर्तमान में मेरे पास कुछ एनोटेशन के साथ एक नक्शा दृश्य है। मेरे पास कस्टम छवियों के साथ एनोटेशन है। जिस समस्या को मैं ठीक करने की कोशिश कर रहा हूं वह छवियों की संवेदनशीलता है। जब मैं उन्हें खींचने की कोशिश करता हूं, ऐसा लगता है कि मुझे ध्यान केंद्रित करने के लिए सटीक केंद्र को छूना है। क्या स्पर्श को बड़ा करने का कोई तरीका है?मैं एमकेएनोटेशन व्यू स्पर्श संवेदनशील कैसे बना सकता हूं?

उत्तर

17

ऐसा करने के लिए, आपको अपना खुद का कस्टम MKAnnotationView बनाने के लिए MKAnnotationView को उप-वर्ग करने की आवश्यकता है। अपने उप-वर्ग में, निम्न कार्यों को ओवरराइड करें:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event 
{ 
    // Return YES if the point is inside an area you want to be touchable 
} 

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event 
{ 
    // Return the deepest view that the point is inside of. 
} 

यह इंटरैक्टिव दृश्य (जैसे बटन, इत्यादि) दबाए जाने की अनुमति देता है। MKAnnotationView में डिफ़ॉल्ट कार्यान्वयन pointInside और hitTest पर सख्त नहीं है क्योंकि यह वास्तव में एक अलग एनोटेशन पर भेजने के लिए एक टिप्पणी के अंदर प्रेस की अनुमति देता है। यह टच-पॉइंट पर निकटतम एनोटेशन सेंटर को ढूंढकर और घटनाओं को उस एनोटेशन में भेजकर ऐसा करता है, ऐसा इसलिए है कि निकट-साथ (ओवरलैपिंग) एनोटेशन एक-दूसरे को चुने जाने से अवरुद्ध न करें। हालांकि, यदि आप उपयोगकर्ता को सबसे ज्यादा एनोटेशन चुनना और खींचना है, तो संभवतः उपर्युक्त विधि शायद आप जो चाहते हैं, अन्यथा आप सही टिप्पणियों पर सेट करेंगे।

संपादित करें: मैं hitTest:withEvent: का एक उदाहरण कार्यान्वयन के लिए टिप्पणी में कहा गया था - यह पर निर्भर करता है कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं। मूल प्रश्न ने एनोटेशन के भीतर छवियों को छूने और खींचने का सुझाव दिया, जबकि मेरे मामले में मेरे पास एनोटेशन के अंदर कुछ बटन हैं जो मैं इंटरैक्टिव होना चाहता हूं।MKAnnotationView कार्यान्वयन (मेरी कार्यान्वयन की पहली पंक्ति पर super के रूप में कहा जाता है) केवल पहले (सबसे बाहरी) दृश्य देता है, इसके माध्यम से ड्रिल-डाउन नहीं करता है -

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event 
{ 
    UIView* hitView = [super hitTest:point withEvent:event]; 
    if (hitView != nil) 
    { 
     // ensure that the callout appears above all other views 
     [self.superview bringSubviewToFront:self]; 

     // we tapped inside the callout 
     if (CGRectContainsPoint(self.resultView.callButton.frame, point)) 
     { 
      hitView = self.resultView.callButton; 
     } 
     else if (CGRectContainsPoint(self.resultView.addButton.frame, point)) 
     { 
      hitView = self.resultView.addButton; 
     } 
     else 
     { 
      hitView = self.resultView.viewDetailsButton; 
     } 
     [self preventSelectionChange]; 
    } 
    return hitView; 
} 

आप यह काफी सरल है देख सकते हैं: यहाँ मेरी कोड है यह देखने के लिए पदानुक्रम देखें कि वास्तव में स्पर्श किस उप-दृश्य में है। मेरे मामले में मैं सिर्फ यह जांचता हूं कि स्पर्श तीन बटनों में से एक के अंदर है और उनको वापस कर दें। अन्य परिस्थितियों में आपके पास पदानुक्रम या अधिक जटिल हिट परीक्षणों के माध्यम से सरल आयताकार-आधारित ड्रिलिंग हो सकती है, उदाहरण के लिए उन हिस्सों से गुजरने की अनुमति देने के लिए आपके दृश्य में पारदर्शी क्षेत्रों से बचने के लिए। यदि आपको ड्रिल करने की आवश्यकता है, तो CGRectContainsPoint का उपयोग उसी तरह किया जा सकता है जैसा मैंने इसका उपयोग किया है, लेकिन आपके द्वारा ड्रिल किए गए प्रत्येक दृश्य-स्तर के लिए स्थानीय बिंदु निर्देशांक में अपने अंक ऑफ़सेट करना याद रखें।

preventSelectionChange विधि, बनने चयनित से अपने कस्टम एनोटेशन को रोकने के लिए है मैं नक्शा पिन से एक अनुकूलन/इंटरैक्टिव कॉल आउट के रूप में यह उपयोग कर रहा हूँ और इस के बजाय चयनित चयन यह व्याख्या करने के लिए बदलने की अनुमति देता करने के लिए पिन यह संबंधित है रहता है।

+0

क्या आप हिटटेस्ट विधि को कार्यान्वित कर सकते हैं? – Daniel

+0

अगर मैं फिर से अपना जवाब वोट दे सकता तो मैं करूँगा! अद्यतन के लिए धन्यवाद। – Daniel

+0

नमस्ते फिर, बिंदु के बारे में कैसे: withEvent:? क्या यह है जहां आप CGRectContainsPoint का प्रस्ताव लागू करते हैं? – Daniel

0

मैं निम्नलिखित तरीके

  1. इशारा पहचानकर्ता वर्ग कि छूता
  2. UIImage वर्ग का एक उपवर्ग बनाएं हैंडल का एक उपवर्ग बनाएं में कुछ इसी तरह लागू किया, इस वर्ग के अपने इशारों को संभालने के लिए पहचानकर्ता वर्ग का उपयोग करता है एनोटेशन में
  3. उपयोग इस

इशारा पहचानकर्ता उपवर्ग अपने इशारों संभाल लेंगे अगर तुम उन्हें ima में किसी भी बिंदु पर प्रदर्शन जीई। यह आपकी मदद करनी चाहिए।

रखें हम पर इस समाधान यू के लिए काम किया है कि क्या अद्यतन ...

1

आप MKAnnotationView उपवर्ग रह गए हैं या आप इसे की छवि संपत्ति सिर्फ सेट बदल दिया?

यहां छवि संपत्ति सेट करने के लिए प्रलेखन है।

चर्चा: इस संपत्ति के लिए एक नई छवि नियत भी दृश्य के फ्रेम के आकार बदलता है इतना है कि यह चौड़ाई और नई छवि की ऊंचाई से मेल खाता है। दृश्य के फ्रेम की स्थिति बदल नहीं है।

अपने एनोटेशन व्यू के फ्रेम के आकार की जांच करें, जहां आपका ऑब्जेक्ट स्पर्श प्राप्त कर सकता है।

0

@jhabbott समाधान ने कभी मेरे लिए काम नहीं किया, जैसा कि मैंने here का उल्लेख किया था।

मेरे पास एक छवि और एक लेबल पक्ष है। छवि annotationview image संपत्ति की स्थापना द्वारा दिखाया गया था, और एक UILabel

जोड़कर लेबल मैं पुनः निर्देशित UILabel एक (जो छवि क्षेत्र शामिल है) और hitTest करने के लिए func point(inside:with:) विधि था बिल्कुल वैसा ही दृश्य है कि क्या मैं पर क्लिक किया वापसी लेबल या छवि। लेकिन लेबल क्लिक किसी भी कॉलबैक का उत्पादन नहीं किया था ...

अंत में, मैं समाप्त हो गया MKAnnotationView फ्रेम के विस्तार लेबल + छवि को संलग्न करने से, मैं nil को annotationView.image निर्धारित करते हैं, और मैं अपने कस्टम UIImageView बनाया।

self.frame = CGRect(x: 0, y: 0, width: 
self.myLabel.frame.width, height: self.myLabel.frame.height) 
self.centerOffset = CGPoint(x: self.frame.width/2, y: self.myImageView.frame.height/2) 

तो मैं नष्ट कर दिया point(inside:with:) और hitTest(point:with:) ओवरराइड कि कुछ नहीं किया:

क्योंकि मैं छवि के बीच में लंगर बिंदु चाहता था, मैं एक कस्टम स्थापित करने के लिए किया था।

और अब, पहली बार, मेरी एनोटेशन व्यू पूरी तरह प्रतिक्रियाशील है।

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