2011-02-07 16 views
5

मान लीजिए कि मेरे पास UIViewController उप-वर्ग है जो कुछ UIViews का ख्याल रखता है।UIView, इसका पर्यवेक्षण और स्पर्श बेगन:

UIViewController:

- (void)viewDidLoad { 
    UIImageView *smallImageView... 
    [self.view addSubview:smallImageView]; 

    UIButton *button.. 
    [self.view addSubview:button]; 

    UIView *bigUIView.. // covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0)) 
    [self.view addSubview:bigUIView]; 
... 
} 

AFAIK, के बाद से bigUIView frontmost दृश्य है और पूरे स्क्रीन को शामिल किया गया है, यह touchesBegan:withEvent: प्राप्त होगा और अन्य दृश्यों इन UIViews UIViewController के view संपत्ति के subviews) के रूप में जुड़ जाते हैं , जैसे button को कोई भी स्पर्श ईवेंट नहीं मिलेगा।

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
    [self.superview touchesBegan:touches withEvent:event]; 

    ... hit test the touch for this specific uiview.. 
} 

नोट्स::

मैं bigUIView कक्षा में निम्नलिखित को लागू करने की कोशिश की

  1. bigUIView के superview UIViewController के view संपत्ति को संदर्भित करता है, यह यह है सभी के लिए स्पर्श घटना का प्रचार करता है subviews?
  2. bigUIView में userInteractionEnabled = YES होना चाहिए क्योंकि यह उपयोगकर्ता इनपुट को भी संभालता है।
  3. मैं button/smallImageView को सामने नहीं ला सकता क्योंकि यह मुख्य गेम ऑब्जेक्ट्स (bigUIView के उपन्यास) से ऊपर दिखाई देगा।

अग्रिम धन्यवाद।

उत्तर

11

bigUIView कक्षा में कक्षा में NO वापस करने के लिए ओवरराइड करने का प्रयास करें यदि बिंदु पृष्ठभूमि दृश्य के अन्य सबव्यूज़ में से एक के फ्रेम आयताकार के अंदर है। चूंकि यह इन अन्य विचारों का एक भाई है, इसलिए हिट परीक्षण तंत्र अन्य सबव्यू का परीक्षण जारी रखेगा और उपयोगकर्ता को स्पर्श किए गए बिंदु से संबंधित एक ढूंढ जाएगा।

एलोस, bigUIView कक्षा के बजाय अपने UIViewController सबक्लास में ईवेंट चरण विधियों (-touchesBegan:withEvent:, आदि) को लागू करने पर विचार करें। आईओएस प्रतिक्रियाकर्ता श्रृंखला में उनके विचारों के पीछे नियंत्रकों को सम्मिलित करता है, इसलिए ईवेंट संदेश दृश्य नियंत्रक तक बबल हो जाएंगे जब तक कि अन्य सबव्यूज़ (उदाहरण के लिए, एक बटन) में से कोई एक इसे रोकता है। व्यू कंट्रोलर तब भी आपके द्वारा देखे गए किसी भी संदेश को जो भी संदेश भेज सकता है उसे भेज सकता है।

+0

धन्यवाद jlehr, 'pointInside: withEvent: 'समाधान है। जब कोई अन्य उप-दृश्यों में से किसी एक के फ्रेम आयताकार के अंदर बिंदु है, तो वापस लौटने से 'bigUIView'' 'touganBegan: withEvent: 'विधि को कॉल नहीं किया जाना चाहिए और' बटन 'की क्रिया ट्रिगर हो रही है। ध्यान दें कि यह 'bigUIView' और' बटन' के बीच युग्मन का कारण बनता है। 'BigUIView' पूरी स्क्रीन को कवर करते समय मैं केवल' UIViewController' में ईवेंट चरण विधियों को कैसे रोक सकता हूं? 'BigUIView' कक्षा में एक अलग विधि हस्ताक्षर बनाना और इसे" सभी को पकड़ें "' UIViewController' वर्ग द्वारा प्रस्तुत किया गया है? –

+1

नहीं, 'bigUIView' में ईवेंट चरण विधियों को लागू न करें।इस तरह संदेशों को उत्तरदाता श्रृंखला को तब तक अग्रेषित किया जाएगा जब तक कि वे किसी ऑब्जेक्ट तक पहुंच न जाएं जिसमें ओवरराइड कार्यान्वयन हो (उदाहरण के लिए 'UIButton' या आपके कस्टम' UIViewController' subclass)। – jlehr

+1

युग्मन के संबंध में, अपने व्यू कंट्रोलर में एक प्रतिनिधि विधि को लागू करने पर विचार करें कि 'bigUIView' उदाहरण वास्तविक निर्णय लेने के लिए कॉल कर सकता है। इस तरह व्यू कंट्रोलर यह जानने के लिए ज़िम्मेदार होगा कि कौन सा दृश्य संदेश प्राप्त करता है और वहां कोई युग्मन नहीं होगा। – jlehr

0

आम तौर पर उत्तरदाता श्रृंखला में, घटनाएं पर्यवेक्षकों के पास होती हैं, न कि सबव्यूज़ के लिए। वैसे भी, मैं घटनाओं में बिंदुओं को बटन के स्थानीय समन्वय प्रणाली में परिवर्तित कर दूंगा, और यदि यह हिट करता है, तो नियंत्रक को एक क्रिया भेजें।

+0

मैं टिप्पणी की सराहना करता हूं, यह एक दिलचस्प समाधान है। हालांकि मैं 'bigUIView' (जो "गेम पैकेज" (कैलायर) से संबंधित है) और अन्य यूआई तत्वों (आईबी में निर्मित) के बीच इस उच्च युग्मन से बचने की कोशिश कर रहा हूं। धन्यवाद –

+1

कोई समस्या नहीं। bigUIView को अभी भी अन्य UI elemets के साथ काम करने की आवश्यकता नहीं है। लेकिन मैं सहमत हूं कि जेलेहर का समाधान जाने का रास्ता लगता है! – MHC

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