UILongPressGestureRecognizer को नीचे दबाने पर दो बार कॉल किया जाता है


359

मैं यह पता लगा रहा हूं कि क्या उपयोगकर्ता ने 2 सेकंड के लिए नीचे दबाया है:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
        longPress.minimumPressDuration = 2.0;
        [self addGestureRecognizer:longPress];
        [longPress release];

इस तरह से मैं लंबे प्रेस को संभालता हूं:

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
    NSLog(@"double oo");
}

जब मैं 2 सेकंड से अधिक समय तक दबाता हूं तो टेक्स्ट "डबल ओओ" दो बार प्रिंट हो जाता है। ऐसा क्यों है? मैं कैसे ठीक कर सकता हूं?

जवाबों:


684

UILongPressGestureRecognizer एक निरंतर घटना पहचानकर्ता है। आपको यह देखने के लिए राज्य को देखना होगा कि क्या यह घटना का प्रारंभ, मध्य या अंत है और तदनुसार कार्य करता है। यानी आप शुरुआत के बाद सभी घटनाओं को दूर फेंक सकते हैं, या केवल आवश्यकतानुसार आंदोलन को देख सकते हैं। से कक्षा संदर्भ :

लंबे समय से प्रेस इशारे निरंतर हैं। इशारा शुरू होता है (UIGestureRecognizerStateBegan) जब स्वीकार्य उंगलियों की संख्या (numberOfTouchesRequired) को निर्दिष्ट अवधि (न्यूनतम टिप) के लिए दबाया गया है और स्पर्श आंदोलन की स्वीकार्य सीमा (allowableMovement) से आगे नहीं बढ़ते हैं। जब भी कोई उंगली चलती है, तो हावभाव पहचानकर्ता परिवर्तन स्थिति में स्थानांतरित हो जाता है, और यह तब समाप्त होता है (UIGestureRecognizerStateEnded) जब कोई अंगुली उठती है।

अब आप इस तरह राज्य को ट्रैक कर सकते हैं

-  (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
      NSLog(@"UIGestureRecognizerStateEnded");
    //Do Whatever You want on End of Gesture
     }
    else if (sender.state == UIGestureRecognizerStateBegan){
       NSLog(@"UIGestureRecognizerStateBegan.");
   //Do Whatever You want on Began of Gesture
     }
  }

4
अगला उत्तर नीचे दिखाया गया है कि यह कैसे करना है, लेकिन मैंने यह उत्तर +1 को इसकी विस्तृत व्याख्या और प्रलेखन के लिंक के कारण दिया।
मैट कोनोली

2
केवल दस्तावेज़ीकरण से लिंक करने के बजाय, कोड उदाहरण के साथ अधिक सहायक हो सकता है। मैंने अपना कोड स्निपेट नीचे पोस्ट किया है। UIGestureRecognizerStateBegan राज्य की जाँच करें।
पॉल सोल्ट

UIGestureRecognizerStateChanged
रजनीश

@joelm आपने मुझे बचाया)
एवगेनी क्लेबन

स्विफ्ट 4 के लिए: यदि (प्रेषक ।state == UITapGestureRecognizer.State.ended) {// जो कुछ भी आप चाहते हैं, वह अंत में जेस्चर प्रिंट ("\ n * लॉन्गप्रेस्ड * \ n")} है
रवि

117

UILongPressGestureRecognizer की स्थिति की जांच करने के लिए बस चयनकर्ता विधि पर एक बयान जोड़ें:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {    
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

13
आप नहीं चाहते हैं कि अगर / और ब्लॉक हो, क्योंकि एंडेड की तुलना में अधिक राज्य हैं। जब राज्य बदलता है तो "लॉन्ग प्रेस डिटेक्ट" कई बार प्रिंट करेगा। इसके बजाय UIGestureRecognizerStateBegan राज्य की जाँच करें।
पॉल सोल्ट

2
किसी को वास्तव में उस उत्तर को संपादित करना चाहिए जो शीर्ष टिप्पणी के साथ फिट बैठता है। जैसा कि यह खड़ा कोड प्रदान नहीं करता है।
डेक्कन मैककेना

75

आपको सही स्थिति की जांच करने की आवश्यकता है, क्योंकि प्रत्येक राज्य के लिए अलग-अलग व्यवहार हैं। सबसे अधिक संभावना है कि आप के UIGestureRecognizerStateBeganसाथ राज्य की आवश्यकता होगी UILongPressGestureRecognizer

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];

...

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
    if(UIGestureRecognizerStateBegan == gesture.state) {
        // Called on start of gesture, do work here
    }

    if(UIGestureRecognizerStateChanged == gesture.state) {
        // Do repeated work here (repeats continuously) while finger is down
    }

    if(UIGestureRecognizerStateEnded == gesture.state) {
        // Do end work here when finger is lifted
    }
}

2
लगता है कि आपको राज्य को बदलने के लिए अपनी उंगलियों को स्थानांतरित करना होगा; क्या वो सही है?
अर्काडियन

हो सकता है कि जब उंगली इधर-उधर घूम रही हो तो स्टेटचैनड ट्रिगर हो सकता है, जो कि मैं अपने टेस्ट कोड में कर रहा था।
पॉल सोल्ट

UIGestureRecognizerStateBegan केवल एक बार कहा जाता है जो एक बटन पर एक लंबे प्रेस का पता लगाने पर एक संवाद दिखाने की कोशिश कर मेरी स्थिति के लिए एकदम सही है। अन्य राज्यों को कई बार बुलाया जाता है। धन्यवाद!
डेमियन

19

बस यह प्रयास करें:

उद्देश्य सी

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

स्विफ्ट 2.2:

func handleLongPress(sender:UILongPressGestureRecognizer) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            print("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            print("Long press detected.");
        }
}

14

यहां देखें कि इसे स्विफ्ट में कैसे संभाला जाए:

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}

13

स्विफ्ट 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

    if sender.state == .ended {
        print("Long press Ended")
    } else if sender.state == .began {
        print("Long press detected")
    }

6

आपका इशारा हैंडलर प्रत्येक अवस्था के लिए कॉल करता है। इसलिए आपको प्रत्येक राज्य के लिए एक चेक लगाना होगा और अपना कोड आवश्यक अवस्था में रखना होगा।

अगर-दूसरे पर स्विच-केस का उपयोग करना पसंद करना चाहिए:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                         initWithTarget:self 
                                         action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = 1.0;
    [myView addGestureRecognizer:longPress];
    [longPress release];

-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
        switch(gesture.state){
          case UIGestureRecognizerStateBegan:
               NSLog(@"State Began");
               break;
          case UIGestureRecognizerStateChanged:
               NSLog(@"State changed");
               break;
          case UIGestureRecognizerStateEnded:
               NSLog(@"State End");
               break;
          default:
               break;
         }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.