2012-03-15 9 views
15

मैं एक आईफोन ऐप बना रहा हूं जो उपयोगकर्ता को स्क्रीन पर कुछ यूआई तत्वों को पुनर्व्यवस्थित करने देगा।आईफोन आईओएस एक ही नियंत्रण में UILongPressGestureRecognizer और UITapGestureRecognizer को जोड़ने और संघर्ष को रोकने के लिए कैसे?

मैं एक यूआईवी व्यू में एक टैप इशारा पहचानकर्ता और एक लंबी प्रेस इशारा पहचानकर्ता कैसे जोड़ सकता हूं? जब मैं लंबी प्रेस से उंगली उठाता हूं, तो टैप इशारा पहचानकर्ता आग लगा देता है। मैं टैप जेस्चर पहचानकर्ता को अस्थायी रूप से अक्षम कैसे कर सकता हूं या उपयोगकर्ता को लंबे समय तक दबाए जाने पर इसे फायरिंग से कैसे रोक सकता हूं?

धन्यवाद!

उत्तर

46

दोनों इशारों, एक साथ काम निम्नलिखित प्रतिनिधि विधि लागू करने के लिए अनुमति देने के लिए पता नहीं है:

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

यह बनाने के लिए इतना है कि लंबे समय से प्रेस है पहली प्राथमिकता, कार्य करें:

[tapGesture requireGestureRecognizerToFail:longPress];

+0

सलाम बंद। अच्छा उत्तर। –

+0

भी टोपी बंद करो। कोड की यह आखिरी पंक्ति है जो मुझे चाहिए। – dellos

0

आप कोड में इसका ख्याल रख सकते हैं, कि लंबे प्रेस के दौरान, ध्वज सेट करें, और अगर टैप सही हो या टैप कोड को निष्पादित न करें और फिर भी ध्वज को रीसेट न करें। मैं एक बेहतर तरीका

7

एक वैकल्पिक दृष्टिकोण के रूप में, दो अलग-अलग recognisers की जरूरत नहीं है - बस दोनों घटनाओं के लिए LongPress recogniser का उपयोग करें:

कॉन्फ़िगर इस प्रकार है:

UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)]; 
    categoryPanelDrag.minimumPressDuration = 0.0; 

तो इस प्रकार संभाल:

- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture { 

    // _dragStarted is a class-level BOOL 

    if(UIGestureRecognizerStateBegan == gesture.state) { 
     _dragStarted = NO; 
    } 

    if(UIGestureRecognizerStateChanged == gesture.state) { 
     _dragStarted = YES; 
     // Do dragging stuff here 
    } 

    if(UIGestureRecognizerStateEnded == gesture.state) { 

     if (_dragStarted == NO) 
     { 
      // Do tap stuff here 

     } 
     else 
     { 
      // Do drag ended stuff here 
     } 
    } 

    return YES; 

} 
+0

यह काम नहीं करता – Softlion

+1

@ सॉफ़्टलियन UIGestureRecognizerDelegate इंटरफ़ेस को न भूलें।एच फ़ाइल :-) –

+0

वैसे यह संकलित और चलाता है, लेकिन संघर्ष को रोकता नहीं है। मैंने 2 पहचानकर्ताओं और इशारा करते हुए समस्या का समाधान किया। पहचानकर्ता (_: चाहिए पहचानना चाहिए साथ-साथ WithGestureRecognizer :) – Softlion

1

मैं मोबी और तंख़्वाहदार के दृष्टिकोण की कोशिश की थी, लेकिन किसी भी तरह वे अपने प्रोजेक्ट में अच्छी तरह से फिट नहीं था, इसलिए मैं नीचे की तरह हल,

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    NSLog(@"%@ %ld",touch.description, touch.phase); 
    [self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5]; 
    return YES; 
} 

और

- (void)checkTouch:(UITouch *)touch{ 
    NSLog(@"touch phase = %ld",touch.phase); 
    if (touch.phase == UITouchPhaseStationary) { 
     //still holding my hand and this means I wanted longPressTouch 
    } 
    if (touch.phase == UITouchPhaseEnded){ 
     //I released my finger so it's obviously tap 
    } 
} 

यह सरल समाधान हो सकता है लेकिन निश्चित रूप से यह परियोजना पर निर्भर करता है।

9

सफलतापूर्वक संयोजित करने के लिए दोनों की जरूरत है:

1º हैडर पर इशारा प्रतिनिधि इंटरफेस में जोड़े

@interface ViewController : ViewController <UIGestureRecognizerDelegate> 

2º इशारा घटनाओं बनाएँ और स्रोत फ़ाइल में एक दृश्य में जोड़ने के लिए:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch:)]; 
    [tap setNumberOfTapsRequired:1]; // Set your own number here 
    [tap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol 

    UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTouch:)]; 
    [longTap setNumberOfTapsRequired:0]; // Set your own number here 
    [longTap setMinimumPressDuration:1.0]; 
    [longTap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol 
    [tap requireGestureRecognizerToFail:longTap]; // Priority long 

    [self.view addGestureRecognizer:tap]; 
    [self.view addGestureRecognizer:longTap]; 

3º स्रोत फ़ाइल में कॉलबैक जोड़ें:

- (void) touch: (UITapGestureRecognizer *)recognizer 
{ 
    CGPoint location = [recognizer locationInView: self.HUDview]; 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"touch UIGestureRecognizerStateBegan"); 
    } 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"touch UIGestureRecognizerStateEnded"); 
     //NSLog(@"Position of touch: %.3f, %.3f", location.x, location.y); // Position landscape 
    } 
} 

- (void) longTouch: (UILongPressGestureRecognizer *)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"longTouch UIGestureRecognizerStateBegan"); 
    } 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"longTouch UIGestureRecognizerStateEnded"); 
    } 
} 

4º सेट इशारा पहचानकर्ता उपलब्ध:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 
संबंधित मुद्दे