2013-06-07 8 views
6

मैं एक मॉड्यूल लिख रहा हूं कि हर बार जब मैं एक दृश्य पर स्वाइप करता हूं, तो दृश्य के आधे आकार के साथ दो उप दृश्य जोड़े जाएंगे। उन सबव्यूज़ में अपने स्वयं के इशारे होते हैं (उदाहरण: पैन, ...)। पहली बार मैं स्वाइप करता हूं, यह ठीक है क्योंकि कोई सबव्यू नहीं बनाया गया है। लेकिन एक बार सबव्यू बनने के बाद, हर बार जब मैं स्वाइप करता हूं, स्वाइप इशारा हमेशा इसके सबव्यूव में जाता है। मैं बनाने के लिए इस्तेमाल किया shouldRecognizeSimultaneouslyWithGestureRecognizer :(, तो मैं 2 बार स्वाइप करने के लिए विभाजित करने के लिए है।पर्यवेक्षण से सबव्यूव में एक इशारा कैसे अवरुद्ध करें?

मैं जानना चाहता हूँ वहाँ अपनी subview को पारित करने के लिए स्वाइप ब्लॉक करने के लिए किसी भी तरह से है? धन्यवाद।

अद्यतन
वे इशारे एक साथ काम करते हैं। लेकिन अभी भी कुछ समस्याएं हैं। माता-पिता के दृश्य में स्वाइप इशारा है, सबव्यूव में इसका पैन इशारा है। चूंकि मैं souldRecognizeSimultaneouslyWithGestureRecognizer का उपयोग करता हूं, कभी-कभी जब मैं पैनिंग कर रहा हूं, स्वाइप इशारा ट्रिगर्स होता है। तो, आप जानते हैं कि कैसे इस स्थिति में पैन सक्रिय होने पर स्वाइप अक्षम करें?

+0

आप क्या व्यवहार चाहते हैं? यदि आपके पास सबव्यू और पैरेंट व्यू दोनों में इशारा पहचानकर्ता है, तो जाहिर है कि एक संघर्ष है। – Mar0ux

+0

मैं चाहता हूं कि व्यवहार केवल मूल दृश्य में स्वाइप हो, न कि सबव्यूव। मैंने इस इशारा को सबव्यू में नहीं जोड़ा। –

उत्तर

12

आप UIGestureRecognizerDelegate विधि को लागू करने के लिए है:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; 

और इशारा recognizers के प्रतिनिधि के रूप में अपने नियंत्रक जोड़ें। फिर, जब दो इशारा पहचानकर्ता एक इशारा करते हैं, तो इस विधि को बुलाया जाएगा और यहां आप अपने ऐप के लिए इच्छित तर्क को कार्यान्वित कर सकते हैं।

नियंत्रक के इंटरफेस घोषणा में आप टाइप करना होगा:

@interface testcViewController() <UIGestureRecognizerDelegate> 

तब, जब इशारा पहचानकर्ता बनाने:

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)]; 
swipe.direction = UISwipeGestureRecognizerDirectionDown; 
swipe.delegate = self; 
[self.view addGestureRecognizer:swipe]; 

और फिर, अंत में, आप इस विधि नियंत्रक करने के लिए जोड़ :

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    BOOL shouldInteract = NO; 
    //Here you decide whether or not the two recognizers whould interact. 
    return shouldInteract; 
} 

संपादित तुम भी लागू कर सकते हैं

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer; 

और यहाँ, का पता लगाने अगर आप पहले से subviews प्रस्तुत किया है, और किसी भी इशारा आप चाहते हैं ब्लॉक।

2

सेट अपने subview की नहीं करने के लिए userinteractionEnabled

subview.userinteractionEnabled=NO 

अगर आप न userInteraction अक्षम करना चाहते हैं तो cancelsTouchesInView विधि का उपयोग

cancelsTouchesInView-तो एक इशारा पहचानकर्ता अपने हाव-भाव, यह है कि शेष छूता unbinds पहचानता उनके विचार से इशारा (इसलिए विंडो उन्हें वितरित नहीं करेगा)। खिड़की पहले डिस्प्ले स्पर्श को रद्द कर देती है (स्पर्श किए गए: withEvent :) संदेश। यदि इशारा पहचानकर्ता अपने इशारे को नहीं पहचानता है, तो दृश्य को मल्टी-टच अनुक्रम में सभी स्पर्शों को प्राप्त होता है।

+0

तो यह सबव्यू इशारा भी अक्षम कर देगा। मुझे वह नहीं चाहिए था। मैं चाहता हूं कि सबव्यूज़ पर बातचीत की जा सके। –

+0

सबव्यूज़ में इशारा पहचानकर्ता भी हैं, इसलिए उपयोगकर्ता इंटरैक्शन सक्षम होना चाहिए। –

0

इस तरह की कोशिश,

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

पर्यवेक्षकों से सभी इशारा पहचानकर्ताओं को अवरुद्ध करने के लिए मैंने एक UIGestureRecognizer उप वर्ग बनाया जो केवल एक दृश्य से जुड़ा हुआ होगा। आप सभी इशारा कुछ दृश्य की मूल विचारों से जुड़ी recognizers अवरोधित करना चाहते हैं

#import "WEBlockingGestureRecognizer.h" 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@implementation WEBlockingGestureRecognizer 

- (id)init { 
    return [self initWithTarget:self action:@selector(__dummyAction)]; 
} 

- (id)initWithTarget:(id)target action:(SEL)action { 
    if ((self = [super initWithTarget:target action:action])) { 
     self.cancelsTouchesInView = NO; 
    } 
    return self; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    if (self.state == UIGestureRecognizerStatePossible) { 
     self.state = UIGestureRecognizerStateBegan; 
    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    self.state = UIGestureRecognizerStateRecognized; 
} 

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer { 
    return [self isGestureRecognizerAllowed:preventingGestureRecognizer]; 
} 

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer { 
    return ![self isGestureRecognizerAllowed:preventedGestureRecognizer]; 
} 

- (BOOL)shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return ![self isGestureRecognizerAllowed:otherGestureRecognizer]; 
} 

- (BOOL)shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return NO; 
} 

- (BOOL)isGestureRecognizerAllowed:(UIGestureRecognizer *)gr { 
    return [gr.view isDescendantOfView:self.view]; 
} 

- (void)__dummyAction { 

} 

@end 

, बस निम्न करें:: निम्नलिखित कोड (मेरी WEPopover परियोजना से लिया गया) देखें

- (void)blockParentGesturesForView:(UIView *)v { 
    [v addGestureRecognizer:[WEBlockingGestureRecognizer new]]; 
} 
0

है कि मैं ध्यान में रखते हुए एक dialogView मेरी UIViewController के मुख्य view मैं मुख्य view करने के लिए एक इशारा पहचानकर्ता संलग्न कर रहा हूँ का एक सीधा subview के रूप है और इशारा पहचानकर्ता delegate) के रूप में मेरे विचार नियंत्रक की स्थापना निम्नलिखित (कार्य करें:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 
    let point = touch.location(in: view) 
    return !dialogView.frame.contains(point) 
} 
संबंधित मुद्दे