6

असफल होने के लिए एकल टैप की आवश्यकता है this question पर इसी तरह की समस्या के साथ, मैं अपने UICollectionView उदाहरण में एक डबल टैप जेस्चर पहचानकर्ता जोड़ने की कोशिश कर रहा हूं।UICollectionView में डबल टैप जोड़ें;

मुझे डिफ़ॉल्ट एकल टैप को UICollectionViewDelegate विधि collectionView:didSelectItemAtIndexPath: पर कॉल करने से रोकने की आवश्यकता है।

इस लक्ष्य को हासिल करने के लिए मैं कोड straight from Apple's Collection View Programming Guide (Listing 4-2) लागू: एक डबल नल पर tapGesture आग लेकिन डिफ़ॉल्ट टैप रोका और नहीं कर रहा है:

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
NSArray* recognizers = [self.collectionView gestureRecognizers]; 

// Make the default gesture recognizer wait until the custom one fails. 
for (UIGestureRecognizer* aRecognizer in recognizers) { 
    if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) 
     [aRecognizer requireGestureRecognizerToFail:tapGesture]; 
} 

// Now add the gesture recognizer to the collection view. 
tapGesture.numberOfTapsRequired = 2; 
[self.collectionView addGestureRecognizer:tapGesture]; 

इस कोड को अपेक्षा के अनुरूप काम नहीं कर रहा है प्रतिनिधि की didSelect... विधि अभी भी बुलाई गई है।

डीबगर में कदम उठाने से पता चलता है कि अगर स्थिति, [aRecognizer isKindOfClass:[UITapGestureRecognizer class]], कभी भी सत्य का मूल्यांकन नहीं करती है और इसलिए नई tapGesture पर विफलता-आवश्यकता स्थापित नहीं की जा रही है।

इस डिबगर चल रहा है के माध्यम से हर बार आदेश के लिए लूप:

po (void)NSLog(@"%@",(NSString *)NSStringFromClass([aRecognizer class])) 

पता चलता है कि डिफ़ॉल्ट जेस्चर recognizers (वास्तव में) उदाहरणों नहीं UITapGestureRecognizer हैं।

इसके बजाय वे निजी कक्षाएं UIScrollViewDelayedTouchesBeganGestureRecognizer और UIScrollViewPanGestureRecognizer हैं।

सबसे पहले, मैं निजी एपीआई के नियमों को तोड़ने के बिना स्पष्ट रूप से इनका उपयोग नहीं कर सकता। दूसरा, UIScrollViewDelayedTouchesBeganGestureRecognizer से requireGestureRecognizerToFail: के माध्यम से वांछित व्यवहार प्रदान करने के लिए प्रतीत नहीं होता है - यानी प्रतिनिधि का didSelect... अभी भी कहा जाता है।

मैं संग्रह दृश्य में दो बार टैप जोड़ने के लिए UICollectionView के डिफ़ॉल्ट इशारा पहचानकर्ताओं के साथ कैसे काम कर सकता हूं और डिफ़ॉल्ट एकल टैप को प्रतिनिधि की collectionView:didSelectItemAtIndexPath: विधि को फायर करने से रोक सकता हूं?

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

+0

लागू नहीं कर रही है 'collectionView: didSelectItemAtIndexPath:' पर्याप्त? – cahn

+0

@cahn: डर नहीं - मुझे मानक व्यवहार के अलावा डबल टैप की आवश्यकता है। –

+0

[यह प्रश्न] (http://stackoverflow.com/questions/12792661/how-to-detect-double-taps-on-cells-in-a-uicollectionview) आपके जैसा ही समस्या हल करने लगता है। क्या यह काम करता है? –

उत्तर

4

मेरा समाधान संग्रह को लागू नहीं करना था दृश्य: didSelectItemAtIndexPath लेकिन दो इशारा पहचानकर्ताओं को लागू करने के लिए।

self.doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processDoubleTap:)]; 
    [_doubleTapGesture setNumberOfTapsRequired:2]; 
    [_doubleTapGesture setNumberOfTouchesRequired:1]; 

    [self.view addGestureRecognizer:_doubleTapGesture]; 

    self.singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processSingleTap:)]; 
    [_singleTapGesture setNumberOfTapsRequired:1]; 
    [_singleTapGesture setNumberOfTouchesRequired:1]; 
    [_singleTapGesture requireGestureRecognizerToFail:_doubleTapGesture]; 

    [self.view addGestureRecognizer:_singleTapGesture]; 

इस तरह मैं एकल और डबल नल को संभाल सकता हूं। एकमात्र गोचा मैं देख सकता हूं कि सेल डबलटैप्स पर चुना जाता है लेकिन अगर यह परेशान होता है तो आप इसे अपने दो चयनकर्ताओं में संभाल सकते हैं।

+0

उत्तर के लिए धन्यवाद। ऐसा लगता है कि यह जाने का रास्ता है। –

+0

मैं निम्नलिखित कारणों से इस समाधान की अनुशंसा नहीं करता: 1) आपके पास मौजूदा कोड हो सकता है, जो पहले से ही 2 का उपयोग करता है) आप भविष्य में 3 में चयन चाहते हैं) इशारा करने वाले का अर्थ किसी भी विचार और इन विचारों में उपयोग किया जाना चाहिए स्पर्श घटनाओं को संभालने के लिए सभी अलग तर्क हो सकते हैं। देरी टच का उपयोग करना/समाप्त हुआ अधिक स्केलेबल समाधान है। (Szilto के उत्तर देखें) –

+0

मैं अब सहमत हूं, लेकिन वापस '13 में मुझे यकीन है कि मैंने कोशिश की और इसे कभी काम नहीं मिला। मैं स्पष्ट रूप से गलत हो सकता है लेकिन मुझे Sz'z कोड भी पसंद है। –

4

मैं एक UITapGestureRecognizer रजिस्टर करने के लिए निम्नलिखित का उपयोग करें:

UITapGestureRecognizer* singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)]; 
singleTapGesture.delaysTouchesBegan = YES; 
singleTapGesture.numberOfTapsRequired = 1; // number of taps required 
singleTapGesture.numberOfTouchesRequired = 1; // number of finger touches required 
[self.collectionView addGestureRecognizer:singleTapGesture]; 

कस्टम इशारा पहचानकर्ता अन्य स्पर्श घटनाओं के पंजीकरण में देरी से डिफ़ॉल्ट संग्रह दृश्य नल श्रोताओं से अधिक प्राथमिकता हो जाता है YES को delaysTouchesBegan की स्थापना करके। वैकल्पिक रूप से, आप cancelsTouchesInView को YES पर सेट करके पूरी तरह से स्पर्श पहचान को सेट कर सकते हैं।

इशारा निम्नलिखित समारोह के द्वारा नियंत्रित की तुलना में है:

- (void)handleSingleTapGesture:(UITapGestureRecognizer *)sender { 

    if (sender.state == UIGestureRecognizerStateEnded) { 
     CGPoint location = [sender locationInView:self.collectionsView]; 
     NSIndexPath *indexPath = [self.collectionsView indexPathForItemAtPoint:location]; 

     if (indexPath) { 
      NSLog(@"Cell view was tapped."); 
      UICollectionViewCell *cell = [self.collectionsView cellForItemAtIndexPath:indexPath]; 
      // Do something.     
     } 
    } 
    else{ 
     // Handle other UIGestureRecognizerState's 
    } 
} 
+0

मौजूदा कोड को बदले बिना पूरी तरह से काम करता है, .delyaTouchesBegan जाने का रास्ता है। –

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