UISwipeGestureRecognizer के लिए दिशा निर्धारित करना


132

मैं अपने विचार आधारित iPhone परियोजना में सरल स्वाइप जेस्चर पहचान जोड़ना चाहता हूं। सभी दिशाओं (सही, नीचे, बाएं, ऊपर) में इशारों को मान्यता दी जानी चाहिए।

यह UISwipeGestureRecognizer के लिए डॉक्स में कहा गया है:

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

हालांकि मेरे लिए यह काम नहीं करता है। जब सभी चार दिशाएं ओआरईडी हैं तो केवल बाएं और दाएं स्वाइप को मान्यता दी जाती है।

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release]; 
    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

मैंने यह देखने के लिए चार पहचानकर्ताओं को जोड़ने के साथ तय किया लेकिन मैं यह जानने के लिए उत्सुक हूं कि यह डॉक्स में विज्ञापित के रूप में क्यों काम नहीं किया?

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

3
यह पूरी तरह से असंबंधित है, लेकिन [सुपर व्यूडीडलड]; पहला बयान होना चाहिए - (शून्य) देखेंडायलाड
मिहिर मेहता

जवाबों:


115

लगता है जैसे कोई बग है। जैसा कि आपने किया था आप अनुमत दिशा (s) निर्दिष्ट कर सकते हैं। लेकिन जब आप एक्शन सिलेक्टर विधि में स्वाइप को ट्रिगर करने वाली वास्तविक दिशा तक पहुँचने का प्रयास करते हैं तो आपको अभी भी मूल रूप से सेट किए गए बिट मास्क मिलते हैं (अनुमत दिशाओं के लिए)।

इसका मतलब यह है कि वास्तविक दिशा के लिए चेक हमेशा विफल हो जाएगा जब 1 से अधिक दिशा की अनुमति हो। जब आप चयनकर्ता विधि (यानी -(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer) में 'दिशा' के मान को आउटपुट करते हैं, तो आप इसे अपने लिए बहुत आसानी से देख सकते हैं ।

एप्पल को एक बग रिपोर्ट (# 8276386) दर्ज की।

[अपडेट] मुझे Apple से यह कहते हुए जवाब मिला कि जैसा इरादा था वैसा ही काम करता है।

उदाहरण के लिए टेबल व्यू में आप 'डिलीट' को ट्रिगर करने के लिए टेबल व्यू सेल में बाएं या दाएं स्वाइप कर सकते हैं (इसमें बाईं और दाईं ओर दिए गए स्वाइप जेस्चर के निर्देश होंगे)

इसका मतलब यह है कि मूल वर्कअराउंड वह तरीका है जिसका उपयोग किया जाना चाहिए। दिशा संपत्ति का उपयोग केवल इशारों को सही ढंग से मान्यता प्राप्त करने के लिए किया जा सकता है, लेकिन मान्यता को ट्रिगर करने वाली वास्तविक दिशा की तुलना करने के लिए एक सफल मान्यता पर निष्पादित विधि में नहीं।


35
मैं शर्त लगाने को तैयार हूं कि लगभग हर कोई जो पहले स्वाइप जेस्चर पहचानकर्ता का उपयोग करता है, वह उसी गलत धारणा को गलत बनाता है कि दिशा संपत्ति कैसे काम करनी चाहिए।
मेमों

यह मूर्खतापूर्ण है कि ऊपर, नीचे, बाएं और दाएं स्वाइप को ट्रैक करने के लिए 4 अलग-अलग पहचानकर्ता बनाएं, लेकिन आप वहां हैं।
१।

वाह कि थोड़े बेकार है, एक बड़ी बात नहीं है, लेकिन लगता है कि वे कुछ जोड़ा जा सकता है
marchinram

2
उनकी हेडर फ़ाइल कहती है: @property (nonatomic) UISwipeGestureRecognizerDirection दिशा; // डिफ़ॉल्ट UISwipeGestureRecognizerDirectionRight है। स्वाइप की वांछित दिशा। कई दिशाओं को निर्दिष्ट किया जा सकता है
निकोट्रो

1
सहमत है कि यह एप्पल के हिस्से पर एक अजीब कार्यान्वयन की तरह लगता है। आपको कई दिशाओं को निर्दिष्ट करने में सक्षम होना चाहिए और फिर उन दिशाओं में से किसी एक के लिए परीक्षण करना चाहिए।
क्रिस जूल

25

मैंने देखा कि बाएं / दाएं और ऊपर / नीचे के इशारे जोड़े में एक साथ काम करते हैं, इसलिए आपको केवल दो जेस्चर पहचानकर्ताओं को निर्दिष्ट करने की आवश्यकता है। और डॉक्स गलत प्रतीत होते हैं।


यह सही उपाय है। 2 जीआर, ऊपर और नीचे के लिए एक / एक बाएं और दाएं के लिए। बिंगो!
logancautrell

22

खैर जो बेकार है, मैंने 2 इशारों जैसे लार्स को जोड़कर समस्या को हल किया और यह पूरी तरह से काम किया ...

1) वाम / अधिकार 2) ऊपर / नीचे

  

UISwipeGestureRecognizer *swipeLeftRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeLeftRight setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft )];
    [self.view addGestureRecognizer:swipeLeftRight];

    UISwipeGestureRecognizer *swipeUpDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeUpDown setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown )];
    [self.view addGestureRecognizer:swipeUpDown];

13
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

अब यह didSwipe फ़ंक्शन है

- (void) didSwipe:(UISwipeGestureRecognizer *)recognizer{
      if([recognizer direction] == UISwipeGestureRecognizerDirectionLeft){
          //Swipe from right to left
          //Do your functions here
      }else{
          //Swipe from left to right
          //Do your functions here
      }
 }

5

यदि आपका Xcode 4.2 का उपयोग कर आप Gesture Recognizers @ storyboard जोड़ सकते हैं और फिर GUI Gesture Recognizers को IBActions से लिंक कर सकते हैं।

आप यूटिलिटी पेन के ऑब्जेक्ट लाइब्रेरी (राइट पेन के निचले हिस्से) में जेस्चर रिकॉगनाइजर्स पा सकते हैं।

फिर यह सिर्फ उचित कार्रवाई के लिए नियंत्रण-खींचने का मामला है।


5

यदि आप चाहते हैं कि यह चारों दिशाओं का पता लगाए, तो आपको चार उदाहरण बनाने होंगे, जैसा आपने अपने काम के दौरान किया था।

यहाँ क्यों है : UISwipeGestureRecognizer का एक ही उदाहरण जो आप बनाते हैं वह उदाहरण है जो प्रेषक को प्रेषक को दिया जाता है। इसलिए यदि आप इसे चारों दिशाओं को पहचानने के लिए निर्धारित करते हैं, तो यह सच हो जाएगाsgr.direction == xxx जहां xxx चार दिशाओं में से कोई एक है।

यहाँ एक वैकल्पिक कार्य है जिसमें कम कोड शामिल हैं (ARC उपयोग मान लिया गया है):

for(int d = UISwipeGestureRecognizerDirectionRight; d <= UISwipeGestureRecognizerDirectionDown; d = d*2) {
    UISwipeGestureRecognizer *sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    sgr.direction = d;
    [self.view addGestureRecognizer:sgr];
}

2

यहाँ UISwipeGestureRecognizer उपयोग के लिए एक कोड नमूना है। टिप्पणी नोट करें।

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //add gesture recognizer. The 'direction' property of UISwipeGestureRecognizer only sets the allowable directions. It does not return to the user the direction that was actaully swiped. Must set up separate gesture recognizers to handle the specific directions for which I want an outcome.
    UISwipeGestureRecognizer *gestureRight;
    UISwipeGestureRecognizer *gestureLeft;
    gestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];//direction is set by default.
    gestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];//need to set direction.
    [gestureLeft setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    //[gesture setNumberOfTouchesRequired:1];//default is 1
    [[self view] addGestureRecognizer:gestureRight];//this gets things rolling.
    [[self view] addGestureRecognizer:gestureLeft];//this gets things rolling.
}

swipeRight और swipeLeft ऐसी विधियाँ हैं जिनका उपयोग आप बाएं या दाएं स्वाइपिंग के आधार पर विशिष्ट गतिविधियों को करने के लिए करते हैं। उदाहरण के लिए:

- (void)swipeRight:(UISwipeGestureRecognizer *)gesture
{
    NSLog(@"Right Swipe received.");//Lets you know this method was called by gesture recognizer.
    NSLog(@"Direction is: %i", gesture.direction);//Lets you know the numeric value of the gesture direction for confirmation (1=right).
    //only interested in gesture if gesture state == changed or ended (From Paul Hegarty @ standford U
    if ((gesture.state == UIGestureRecognizerStateChanged) ||
    (gesture.state == UIGestureRecognizerStateEnded)) {

    //do something for a right swipe gesture.
    }
}

2
UISwipeGestureRecognizer *Updown=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            Updown.delegate=self;
            [Updown setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp];
            [overLayView addGestureRecognizer:Updown];

            UISwipeGestureRecognizer *LeftRight=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            LeftRight.delegate=self;
            [LeftRight setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight];
            [overLayView addGestureRecognizer:LeftRight];
            overLayView.userInteractionEnabled=NO;


    -(void)handleGestureNext:(UISwipeGestureRecognizer *)recognizer
    {
        NSLog(@"Swipe Recevied");
        //Left
        //Right
        //Top
        //Bottom
    }

2

स्विफ्ट 2.1

मुझे निम्नलिखित का उपयोग करना था

    for var x in [
        UISwipeGestureRecognizerDirection.Left,
        UISwipeGestureRecognizerDirection.Right,
        UISwipeGestureRecognizerDirection.Up,
        UISwipeGestureRecognizerDirection.Down
    ] {
        let r = UISwipeGestureRecognizer(target: self, action: "swipe:")
        r.direction = x
        self.view.addGestureRecognizer(r)
    }

1

हम्म, अजीब, यह मेरे लिए एकदम सही काम करता है, मैं बिल्कुल यही काम करता हूं

लगता है कि आपको देखने की कोशिश करनी चाहिए

UIGestureRecognizerDelegate विधि

- (BOOL)gestureRecognizerShouldBegin:(UISwipeGestureRecognizer *)gestureRecognizer {
   // also try to look what's wrong with gesture
   NSLog(@"should began gesture %@", gestureRecognizer);
   return YES;
}

लॉग में आपको कुछ इस तरह देखना होगा:

इशारा शुरू किया; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; दिशा = ऊपर, नीचे, बाएँ, दाएँ>


क्या काम नहीं करता है? जेस्चरकॉन्सेज़रशोल्डबिन: ठीक काम करता है।
डेनियल आयटेकिन

1

इसका उपयोग करें, यह बिट ऑपरेशन होना चाहिए

   gesture.direction & UISwipeGestureRecognizerDirectionUp || 
   gesture.direction & UISwipeGestureRecognizerDirectionDown

0

यह मुझे पागल कर रहा था। मैंने आखिरकार कई स्वाइपग्रेक्चर रिकॉग्निजर्स के लिए एक विश्वसनीय तरीका निकाला।

ऐसा प्रतीत होता है कि आईओएस में एक बग है यदि आपके "एक्शन" चयनकर्ता का नाम कई स्वाइपग्रेचर रिकॉग्निजर्स में समान है। यदि आप उन्हें अलग-अलग नाम देते हैं, जैसे कि handleLeftSwipeFrom और handleRightSwipeFrom, सब कुछ काम करता है।

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.