2010-04-13 19 views
24

में एक साथ इशारा संकेतक UISwipeGestureRecognizer (उदाहरण के लिए, UISwipeGestureRecognizerDirectionRight और UISwipeGestureRecognizerDirectionLeft) का उपयोग करके मुझे दो अलग-अलग स्विचन जेस्चर को पकड़ने की आवश्यकता है। जब मैं addGestureRecognizer विधि के साथ दो अलग-अलग पहचानकर्ता जोड़ता हूं, केवल अंतिम पहचानकर्ता काम करता है। मैंने पढ़ा है कि मुझे इशारा करने की आवश्यकता है इशारा करना चाहिए: पहचानना चाहिए- साथ ही साथ WithGestureRecognizer:UIGestureRecognizerDelegate प्रोटोकॉल की विधि, लेकिन कुछ भी काम नहीं करता है।आईफोन एसडीके

क्या कोई भी दो या दो से अधिक समान संकेतों को पकड़ने के सरल उदाहरण के साथ मदद कर सकता है? धन्यवाद!

उत्तर

33

यह वास्तव में आसान था:

सबसे पहले हम वर्ग बनाना चाहिए, कि UIGestureRecognizerDelegate प्रोटोकॉल लागू करता है:

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate> 
 

@implementation MyGestureDelegate 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ 
    return YES; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
    return YES; 
} 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    return YES; 
} 
 

और इस तरह इसका इस्तेमाल:

 

    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSwipeGestureLeft:)]; 
    [self.view addGestureRecognizer:swipeGestureLeft]; 
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [swipeGestureLeft release]; 

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleSwipeGesture:)]; 
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; 
    [self.view addGestureRecognizer:swipeGesture]; 

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init]; 

    [swipeGesture setDelegate:deleg]; 
    [swipeGesture release]; 

+1

Thx। UIPanGestureRecognizer और UIPinchGestureRecognizer को एक ही दृश्य पर मिलकर काम करने के लिए बस इसका इस्तेमाल किया। उपरोक्त कोड में UIGestureRecognizerDelegate को लागू करने के लिए – Hafthor

+1

इस कोड का उपयोग करें @interface MyGestureDelegate: NSObject ps। टिप के लिए धन्यवाद ... –

+0

मुझे यह नहीं मिला: क्या यह सही है कि केवल दो पहचानकर्ताओं में से एक प्रतिनिधि को सौंपा गया है? – Sjakelien

1

मैं सुझाव देता हूं कि आप इस तकनीक पर थोड़ा सा पढ़ लें कि इशारा पहचानकर्ता इशारा पहचानने के लिए उपयोग करते हैं। मुझे लगता है, पहला पहचानकर्ता इशारा पहचानने की कोशिश करता है, लेकिन यह महसूस करता है कि उसे इसका जवाब नहीं देना है और फिर किसी भी तरह से वह इसे पास नहीं करता है।

यह पढ़ने के लिए बहुत उपयोगी है कि वे कैसे उपयोग करते हैं यह समझने के लिए कि वे कैसे काम करते हैं।

उम्मीद है कि इससे मदद मिलती है।

+0

मुझे ऐसा लगता है, और developer.apple.com पर इस तरह की जानकारी होती है: डिफ़ॉल्ट रूप से ", कोई भी दो इशारा recognizers एक साथ उनके इशारों पहचान करने के लिए प्रयास कर सकते हैं लेकिन आप को लागू करने से इस व्यवहार को बदल सकते हैं gestureRecognizer:। ShouldRecognizeSimultaneouslyWithGestureRecognizer :, एक UIGestureRecognizerDelegate प्रोटोकॉल की वैकल्पिक विधि। इस विधि को तब कहा जाता है जब प्राप्त करने वाले इशारे पहचानकर्ता की पहचान निर्दिष्ट इशारा पहचानकर्ता के संचालन को अवरुद्ध कर देगी, या इसके विपरीत। दोनों इशारा पहचानकर्ताओं को एक साथ अपने संकेतों को पहचानने की अनुमति देने के लिए YES वापस करें। " – user294890

2

उम, प्रलेखन का शीघ्रता से अवलोकन से पता चलता है कि आप जिस तरह से अधिक काम कर रहे हैं की तुलना में आप की जरूरत है:

"दिशा कड़ी चोट की अनुमति दी दिशाओं।

@property(nonatomic) UISwipeGestureRecognizerDirection direction 

चर्चा आप एक से अधिक UISwipeGestureRecognizerDirection बिटवाइज़-या ऑपरेंड का उपयोग कर स्थिरांक निर्दिष्ट द्वारा कई दिशाओं निर्दिष्ट कर सकता है। डिफ़ॉल्ट दिशा UISwipeGestureRecognizerDirectionRight कि "

कौन सा बजाय दो UISwipeGestureRecognizers का उपयोग कर के, कहने के लिए है, तो आपको निम्न सिर्फ कर सकते हैं:।

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
             initWithTarget:self action:@selector(handleSwipeGesture:)]; 

swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft; 

और अपनी कार्रवाई विधि में:

-(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender 
    { 
    if (sender.direction == UISwipeGestureRecognizerDirectionLeft) { 

     //do left action 

    } else { 

     //do right action 

    } 
} 

बहुत सरल, और संघर्ष के लिए बहुत कम प्रवण।

+1

नीचे टिप्पणीकर्ता सही है। यह विज्ञापित के रूप में काम नहीं करेगा। मुझे अपने काम को अधिक ध्यान से देखना चाहिए था! मैं अपने मस्तिष्क तरंगों को खटखटाते हुए सौर फ्लेरेस को दोषी ठहराता हूं ... हाँ, यही वह है, सौर फ्लेरेस ... या कुछ ... – Phoenix

20

उत्तर: "उम, दस्तावेज़ीकरण पर एक त्वरित रूप ..." फीनिक्स अबो से दृढ़ता से काम नहीं करेगा!

वह एक मुखौटा सेट कर रहा है, फिर उसी चर का उपयोग करके परीक्षण करने के लिए जैसे पहचानकर्ता इसे साफ़ कर देता है और एक बिट सेट करता है।यह संग्रहीत करता है के रूप में वह सही ढंग से प्रलेखन से उद्धृत:

कड़ी चोट की अनुमति दी दिशाओं

sender.direction 

बस मुखौटा आप शुरू में और उसके उदाहरण में सेट वापस आ जाएगी, एक को हल कभी नहीं होगा एकल दिशा!

UISwipeGestureRecognizerDirectionRight == 1 
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3 

Additionaly, ज्यादातर मामलों के लिए आप की जरूरत नहीं है:

  • सेटअप एक प्रतिनिधि
  • परमिट एक साथ इशारा मान्यता (जब तक आप एक साथ स्वाइप चाहते हैं, संभावना नहीं)
  • भेज चयनकर्ता को पहचानकर्ता

मेरे लिए निम्नलिखित कार्य करता है:

UISwipeGestureRecognizer* swipe; 

    swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease]; 
    swipe.direction = UISwipeGestureRecognizerDirectionLeft; 
    [view addGestureRecognizer:swipe]; 

    swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease]; 
    swipe.direction = UISwipeGestureRecognizerDirectionRight; // default 
    [view addGestureRecognizer:swipe]; 
+0

यूप, इशारा दिशा को अलग-अलग लागू करना और उन्हें अलग-अलग तरीकों से असाइन करना मेरे लिए अच्छा काम करता है। हालांकि किंडा बेवकूफ है, लेकिन काम करता है। – GeneCode

+0

इस उत्तर ने मेरी समस्या हल की, हालांकि मुझे लगता है कि फीनिक्स का जवाब काम करना चाहिए। बेवकूफ है कि यह नहीं करता है। – RyJ

0

उपयोगकर्ता 2 9 48 9 0 के सुझाव के लिए धन्यवाद, मैं सूचीबद्ध UIGestureRecognizerDelegate विधियों से हाँ लौटकर सफल रहा।

मुझे पता चला कि यह तब काम नहीं करेगा जब मैं वेब दृश्य लोड होने से पहले जेस्चर रिकॉग्नाइज़र जोड़ रहा था। हालांकि मैंने वेबव्यू प्रतिनिधि वेब विधि में वेब व्यू में जेस्चर रिकॉग्नाइज़र जोड़ा:

- (void)webViewDidFinishLoad:(UIWebView *)webView