2012-06-04 8 views
19

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

लेकिन क्या यह सच है कि अगर पर्यवेक्षक के userInteractionEnabled को सेट किया गया है, तो सभी सबव्यू और ऑफस्प्रिंग उपयोगकर्ता इंटरैक्शन के लिए भी अक्षम है? क्या होगा यदि हम केवल मुख्य दृश्य के लिए अक्षम करना चाहते हैं लेकिन सबव्यू के लिए अक्षम नहीं करना चाहते हैं?

+0

हाँ यह सही है। – Lefteris

+0

आह, मैं सोच रहा था कि यूरसपॉन्डर का कौन सा नियम या कौन सा तंत्र इसका कारण बनता है ... भले ही मैं इसे "तथ्य" –

उत्तर

13

आप ऐसा नहीं कर सकते,

इसके बजाय आप निम्नलिखित की तरह अपने विचारों की व्यवस्था बदल जाएगा:

Main View-> subViews 

करने के लिए
Container View -> Main View that you want to set as inactive 
       -> other views that you want to still active 

इसलिए आपकी वर्तमान मुख्य दृश्य और आप वर्तमान subviews होगा भाई बहन बनें, एक नए कंटेनर के बच्चे

+0

"ऐसा नहीं कर सकता" के रूप में याद करता हूं "वह" क्या है? आप किस प्रश्न का जिक्र कर रहे हैं? – Honey

18

यदि यह मी मैं सहायक हो सकता हूं, मै मैट न्यूबर्ग द्वारा प्रोग्रामिंग आईओएस 5 में पाया, पी। 467:

userInteractionEnabled

यदि नहीं करने के लिए सेट, (अपने subviews के साथ) इस दृश्य प्राप्त छूता से बाहर रखा गया है। इस दृश्य पर टच या इसके सबव्यूज़ में से एक "इसके पीछे देखने के लिए" "के माध्यम से गिरें।

इसके अलावा अधिक, एप्पल के इवेंट iOS के लिए गाइड हैंडलिंग का कहना है:

खिड़की वस्तु मारा-परीक्षण और प्रत्युत्तर श्रृंखला का उपयोग करता स्पर्श घटना प्राप्त करने के लिए दृश्य खोजने के लिए। हिट-टेस्टिंग में, एक विंडो हिटटेस्ट कॉल करती है: साथ: दृश्य पदानुक्रम के शीर्ष-दृश्य पर; यह विधिवत कॉलिंग द्वारा विधि की आय से आगे बढ़ता है: साथ: प्रत्येक पर दृश्य पदानुक्रम में देखें जो YES लौटाता है, पदानुक्रम को नीचे ले जाता है जब तक कि यह उस सीमा के भीतर सबव्यू नहीं पाता है, जिसकी सीमा हुई थी। वह दृश्य हिट-टेस्ट व्यू बन जाता है।

और प्रोग्रामिंग आईओएस 5 मैट Neuburg द्वारा, p.485 उल्लेख किया है कि अगर एक दृश्य userInteractionEnabledNO के रूप में, या YES, या अस्पष्टता के रूप में चिह्नित है hidden 0 के करीब दृश्य है, तो और उसके subview चल नहीं की जाएगी HitTest द्वारा (और इसलिए किसी भी स्पर्श के लिए नहीं माना जाता है)।

+1

उन लोगों के लिए उत्कृष्ट जानकारी जो अपने स्वयं के हिटटेस्ट को लागू करते हैं: साथ: '। मुझे यकीन नहीं था कि मुझे पर्यवेक्षण स्तर पर 'if (subview.userInteractionEnabled) 'की जांच करने की आवश्यकता है, लेकिन ऐसा लगता है कि डिफ़ॉल्ट कार्यान्वयन इसकी अपनी' userInteractionEnabled' प्रॉपर्टी 'चेक करता है। – darvids0n

+0

इसके पीछे एक दृश्य में "गिरने" के साथ क्या करता है। "मतलब? क्या इसका मतलब है कि सबव्यूज़ वाले बटन पर टैप करना काम नहीं करेगा? – Honey

1

सबसे पहले विधि

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE; 
    return TRUE; 
} 

दूसरा विधि

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)]; 
    r.cancelsTouchesInView = NO; 
    [agentPicker addGestureRecognizer:r]; 
14

आप दृश्य खुद की अनदेखी करने के hitTest(_:withEvent:) ओवरराइड कर सकते हैं, लेकिन अभी भी अपने subviews को अंतिम रूप देने के।

class ContainerStackView : UIStackView { 
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     let result = super.hitTest(point, withEvent: event) 
     if result == self { return nil } 
     return result 
    } 
} 
संबंधित मुद्दे