उचित भाई को स्पर्श इवेंट पासिंग UIViews


12

मैं एक माता पिता UIView के लिए एक ओवरले में touchesBegan के साथ संपर्क के ईवेंट प्रबंधित करने, लेकिन यह भी नीचे UIView रों भाई स्पर्श इनपुट के माध्यम से पारित करने की अनुमति कोशिश कर रहा हूँ। मुझे उम्मीद थी कि टच इवेंट को संसाधित करने के लिए कुछ सीधा-आगे तरीका होगा और फिर "अब इसे अगले उत्तरदाता को भेजें जैसे कि यह अस्तित्व में नहीं था", लेकिन मुझे लगता है कि nextResponder विधि है जो प्रतीत होता है माता-पिता को मेरे ओवरले व्यू पर वापस करें। वह माता-पिता वास्तव में उस ओवरले व्यू के अगले भाई पर नहीं जा रहा है, इसलिए मैं अनिश्चित हूं कि एक साधारण कार्य की तरह कैसा लगता है जो आम तौर पर टच कॉलबैक के साथ पूरा होता है जो इसे बताने के लिए सही या गलत वापसी मूल्य प्राप्त करता है चाहे विजेट पदानुक्रम को संसाधित करना है या नहीं।

क्या मुझे कुछ याद आ रही है?

3

देर उत्तर, लेकिन मुझे लगता है कि touchesBegan के बजाय hitTest:withEvent: ओवरराइड करना बेहतर होगा। मुझे लगता है कि touchesBegan एक सुंदर "उच्च स्तरीय" विधि है जो केवल एक साधारण चीज करने के लिए है, इसलिए अगर आप आगे प्रसारित करते हैं तो आप उस स्तर पर बदलाव नहीं कर सकते हैं। ऐसा करने के लिए सही जगह hitTest:withEvent: है।

इस बिंदु के बारे में अधिक जानकारी के लिए this S.O. answer पर भी एक नज़र डालें।


1

मैं वही व्यवहार को समझता हूं जिसे आप जॉय की तलाश में कर रहे हैं - मुझे एपीआई में कुछ नहीं मिला है जो इस स्वचालित मैसेजिंग-अप-द-चेन व्यवहार को भाई विचारों के साथ समर्थन देता है।

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

यदि आप स्वयं को इस पैटर्न का उपयोग करके पाते हैं, तो UIView पर एक श्रेणी विधि जोड़ने पर विचार करें जो हिट परीक्षण को समाहित करता है और चयनकर्ता को निष्पादित करने के लिए विचार पूछता है।

मेरे मूल उत्तर

शारीरिक श्रम का एक छोटा सा के साथ, आप इस एक साथ अपने आप को तार कर सकते हैं। मुझे यह करना पड़ा, और यह मेरे लिए काम किया, क्योंकि मेरे पास बार-बार उपयोग करने का मामला था (बटन पर ओवरले व्यू), जहां कुछ कस्टम वर्ग बनाने के लिए यह समझ में आया। यदि आपकी स्थिति समान है, तो इनमें से एक तकनीक पर्याप्त होगी।

विकल्प 1: ओवरले कुछ भी लेकिन सुंदर देखने की जरूरत नहीं है, तो यह स्पर्श userInteractionEnabled = NO के साथ पूरी तरह से निपटने से बाहर निकलना है। इससे ऐसा हो जाएगा कि टच इवेंट इसके माता-पिता UIView (जिस पर यह ओवरले है) पर जाता है।

विकल्प 2: ओवरले है (क्योंकि यह डिफ़ॉल्ट रूप से होगा) स्पर्श घटना को अवशोषित, और फिर माता-पिता UIView यह दर्शाता है कि एक स्पर्श या कुछ इशारा मान्यता दी गई थी पर एक विधि आह्वान, और यहाँ यह क्या है है। इस तरह, ओवरले के पीछे UIView अभी भी स्पर्श पहचान पर कार्य करता है, भले ही किसी और ने हस्तक्षेप किया हो।

विकल्प 2 के साथ, यह UIControlEvent प्रकारों के लिए उपयुक्त है, जैसे UIControlEventTouchDown और UIControlEventTouchUpInside।मेरे मामले में (इसके ऊपर एक कस्टम ओवरले दृश्य के साथ एक कस्टम UIButton सबक्लास), मैं स्पर्श कर दूंगा और बटन पर दो अलग-अलग तरीकों से स्पर्श करूँगा। अगर आग लगती है या घटना के अंदर छूती है तो ये आग बटन पर होती है। लेकिन, वे भी हैंडल हैं जो मैं ओवरले व्यू से आ सकता हूं अगर मुझे अनुकरण करने की आवश्यकता है कि एक बटन प्रेस हुआ।

अपनी आवश्यकताओं पर निर्भर करता है, तो आप ओवरले के बीच एक ज्ञात प्रोटोकॉल है और यह माता पिता UIView है या केवल आपके बुलाया चाहते हैं कि होगा कस्टम विधि के साथ उस पर performSelector: लागू करने से पहले ओवरले UIView परीक्षण अनौपचारिक एक respondsToSelector: चेक के साथ हो सकता था UIView को ओवरले द्वारा कवर नहीं किया गया था, तो स्वचालित रूप से निकाल दिया गया है।