2011-12-03 18 views
7

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

अगर मैं इसे सही, मैं स्पर्श इवेंट UIView उपवर्ग और UITableView द्वारा दोनों नियंत्रित किया जा करने की जरूरत है। मैं उसे कैसे कर सकता हूँ? क्या यह संभव है, यानी touchesMoved UIView उपclass पर ट्रिगर किया जा रहा है और फिर UITableView पर?

किसी भी मदद के लिए बहुत बहुत धन्यवाद।

उत्तर

10

जिस तरह से मैंने इस समस्या को हल किया है वह इस तरह से है कि यह साफ नहीं है, लेकिन यह काम करता है। अगर ऐसा करने का बेहतर तरीका है तो कृपया मुझे बताएं।

मैंने अपने कस्टम UIView के लिए hitTest ओवरराइड किया है ताकि यह नीचे UITableView पर स्पर्श को निर्देशित कर सके। फिर UITableView में मैं touchesBegan, touchesMoved इत्यादि के माध्यम से इशारा कर रहा हूं। वहां मैं पर UIView पर भी कॉल कर रहा हूं।

इस तरह स्पर्श को दो विचारों से नियंत्रित किया जाता है। कारण मैं अन्य तरीकों से नहीं कर रहा हूं (UIView के touchesBeganUITableView के touchesBegan पर कॉल कर रहा है) यह है कि UITableView पर इशारे पहचानकर्ता काम नहीं करेंगे।

UIView उपवर्ग 'hitTest

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // tview is the UITableView subclass instance 
    CGPoint tViewHit = [tView convertPoint:point fromView:self];   
    if ([tView pointInside:tViewHit withEvent:event]) return tView; 

    return [super hitTest:point withEvent:event]; 
} 

UITableView उपवर्ग के touchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    // .... 

    // view is the UIView's subclass instance 
    [view touchesBegan:touches withEvent:event]; 
} 
+0

बहुत अच्छा .. मैं थोड़ी देर के बाद कुछ करने के लिए देख रहा था। पोस्ट करने का शुक्रिया। – riship89

+0

मुझे यह वाकई पसंद है। मैंने सबव्यू पर मैन्युअल रूप से टच्सबेगन आदि को बुलाकर गलत तरीके से करने की कोशिश की। यह विधि बहुत अच्छा काम करता है! – Gandalf458

0

UITableView UIView को अनचाहे स्पर्श ईवेंट रिले करता है। (Google "उत्तरदाता श्रृंखला") UITableView Documentation

तो, आप केवल अपने स्पर्श ईवेंट को UIView में संभाल सकते हैं। इसलिए। अपने UIView में

  1. touchesstart - प्रारंभ चीजें करते

  2. touchesmove - (desable अंक के लिए टाइमर का प्रयोग करें/delayedresponse इतना है कि यह एक निशान की तरह लग रहे हैं) UIView पर पूंछ आकर्षित

  3. touchesend - शेष सामग्री

आशा है कि इससे मदद मिलती है।

+0

अपने उत्तर के लिए धन्यवाद, लेकिन मुझे यकीन है कि नहीं मैं पूरी तरह से समझ कर रहा हूँ (विशेष रूप से मैं पहली बार वाक्य का अर्थ समझ में नहीं आता) । मुझे पता है कि मैं UIView में निशान खींच सकता हूं लेकिन मुझे अभी भी UITableView (स्क्रॉल, चयन, आदि) पर स्पर्श ईवेंट "पास" करने की आवश्यकता होगी। क्षमा करें अगर मैंने गलत समझा है। –

+0

उद्देश्य-सी में, कुछ प्रतिक्रियाकर्ता श्रृंखला कहा जाता है। यदि कोई वर्ग विशेष घटनाओं को संभाल नहीं पाता है, तो उन्हें अपनी सुपर क्लास द्वारा संभालने की आवश्यकता होती है। यदि कोई वर्ग उस घटना को संभाला नहीं जाता है, तो आखिरकार उस घटना को एनएसओब्जेक्ट द्वारा संभाला जाता है। इसलिए, UIView के रूप में आपके मामले में UITableView का सुपरक्लास है, तो आप UIView से UITableView ईवेंट का जवाब दे सकते हैं। – riship89

+0

मैं क्षमा चाहता हूं कि मैं विशेष रूप से उद्देश्य-सी के साथ विशेषज्ञ नहीं हूं ... क्या आप कृपया उदाहरण दे सकते हैं कि यह मामला कैसे लागू हो सकता है? क्या मेरे पास इशारे के UITableView हैंडल होना चाहिए और फिर उन्हें सुपरक्लास पर पास करना चाहिए? कैसे? –

1

नहीं, आप इसे implicity नहीं कर सकते हैं। Event Delivery अध्याय

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

तो, जब खिड़की को स्पर्श करने के लिए स्पर्श किया जाता है तो यह हाँ देता है। वर्तमान क्षण में केवल एक दृश्य स्पर्श को संभाल सकता है।

लेकिन यदि आपको UITableView के लिए ईवेंट को संभालने की आवश्यकता है तो इसे UIView के लिए संभाल लें! आप – convertPoint, – convertRect फ़ंक्शंस के साथ स्पर्श निर्देश को आवश्यक निर्देशांक में परिवर्तित कर सकते हैं, UITableView में सबव्यूव जोड़ सकते हैं और इसे स्थानांतरित कर सकते हैं समन्वय, और कई अन्य चीजों पर निर्भर करता है।

+0

यह निश्चित रूप से काम कर सकता है। मेरे पास UIView सबक्लास के तहत "एकाधिक" तत्व हो सकते हैं ... क्या मुझे उन सभी तत्वों के लिए प्रक्रिया को दोहराने की आवश्यकता है? साथ ही, क्या मुझे वैश्विक निर्देशांक प्राप्त करने के लिए निर्देशांक को परिवर्तित करने की आवश्यकता है, है ना? धन्यवाद। –

+0

जैसा आपने सुझाव दिया है मैंने किया है लेकिन मैं अब UITableView को स्क्रॉल नहीं कर सकता। तुम जानते हो क्यों? धन्यवाद –

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