दिलचस्प पोस्ट
क्या किसी पाश के भीतर या बाहर एक चर को घोषित करना बेहतर है? बहु-मान चयन बक्से से चयनित मूल्य प्राप्त करें jquery-select2 द्वारा? जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम चेतावनी: विकल्प अनवरोधित करें MaxPermSize ऑफ़लाइन होने पर OKHttp के साथ रेट्रोफ़िट कैश डेटा का उपयोग कर सकते हैं एंगल 1.6 में सरल हैश (# /) के बजाय यूआरएल हैश-बैंग (#! /) उपसर्ग पायथन: किसी अपवाद को पकड़ने के बारे में सदस्य कार्य के साथ बूस्ट बाइंड का उपयोग कैसे करें Asp.net वेब एपीआई पद कार्रवाई से पुनर्निर्देशन Django में क्लाइंट-साइड कैशिंग लड़ रहा है HTTP पोस्ट में PHP सर्वर पर एकाधिक पटरेट्स कैसे भेजे जा सकते हैं jQuery के 1 डिवेल को छोड़कर पृष्ठ में कहीं भी क्लिक करें क्या पृष्ठ पुनः लोड किए बिना सीएसएस पुनः लोड करने का एक आसान तरीका है? UnauthorizedAccessException Directory.GetFiles विफलता को हल नहीं कर सकता CSS3 के ग्रेडियंट बॉर्डर्स आप पता सत्यापन कैसे करते हैं?

एक दृश्य के अंदर UIButton जिसमें एक UITapGestureRecognizer है

मेरे पास UITapGestureRecognizer साथ दृश्य है इसलिए जब मैं दृश्य पर टैप करता हूं तो एक और दृश्य इस दृश्य के ऊपर दिखाई देता है। इस नए दृश्य के तीन बटन हैं जब मैं अब इन बटनों में से एक को दबाता हूं, तो मुझे बटन की कार्रवाई नहीं मिलती, मुझे नल जेस्चर एक्शन मिल जाता है। इसलिए मैं इन बटनों का उपयोग करने में सक्षम नहीं हूं। इन बटनों के माध्यम से घटनाओं को प्राप्त करने के लिए मैं क्या कर सकता हूं? अजीब बात ये है कि बटन अभी भी हाइलाइट हो जाते हैं।

मैं इसे नल प्राप्त करने के बाद केवल UITapGestureRecognizer को निकाल नहीं सकता क्योंकि इसके साथ नया दृश्य भी हटाया जा सकता है। इसका मतलब है कि मैं पूर्ण स्क्रीन दृश्य नियंत्रणों की तरह व्यवहार करना चाहता हूं।

Solutions Collecting From Web of "एक दृश्य के अंदर UIButton जिसमें एक UITapGestureRecognizer है"

आप अपने नियंत्रक या दृश्य सेट कर सकते हैं (जो भी इशारे पहचानकर्ता बनाता है) के रूप में UITapGestureRecognizer के प्रतिनिधि उसके बाद प्रतिनिधि में आप लागू कर सकते हैं -gestureRecognizer:shouldReceiveTouch: :। आपके कार्यान्वयन में आप परीक्षण कर सकते हैं कि क्या स्पर्श आपके नए सबव्यू के अंतर्गत आता है, और यदि ऐसा होता है, तो इसे अस्वीकार करने के लिए इशारा पहचानकर्ता को निर्देश दें। निम्नलिखित की तरह कुछ:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // test if our control subview is on-screen if (self.controlSubview.superview != nil) { if ([touch.view isDescendantOfView:self.controlSubview]) { // we touched our control surface return NO; // ignore the touch } } return YES; // handle the touch } 

केवी बलार्ड के जवाब के लिए केसी के अनुवर्ती अनुवर्ती के रूप में:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIControl class]]) { // we touched a button, slider, or other UIControl return NO; // ignore the touch } return YES; // handle the touch } 

यह मूल रूप से सभी उपयोगकर्ता इनपुट प्रकार के नियंत्रण बटन, स्लाइडर्स, आदि जैसे काम करता है

यह उत्तर यहां मिला: लिंक

आप भी उपयोग कर सकते हैं

 tapRecognizer.cancelsTouchesInView = NO; 

जो नल पहचानकर्ता को सभी नलों को पकड़ने के लिए केवल एक ही होने से रोकता है

अद्यतन – माइकल ने इस प्रॉपर्टी का वर्णन करने वाले प्रलेखों के लिंक का उल्लेख किया: रद्द किया गया टच इनव्यू

केविन बलार्ड के उत्तर के लिए एक अनुवर्ती के रूप में, मुझे यह समस्या थी और इस कोड का उपयोग करना समाप्त हो गया था:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ return NO; } return YES; } 

इसका एक ही प्रभाव है लेकिन यह किसी भी UIButton पर किसी भी दृष्टि गहराई पर काम करेगा (मेरे UIButton कई विचारों गहरा था और UIGestureRecognizer के प्रतिनिधियों का कोई संदर्भ नहीं था।)

इसे यहाँ से करने का दूसरा तरीका मिला यह स्पर्श का पता लगाता है कि प्रत्येक बटन के अंदर या नहीं।

(1) बिंदुअंतर: साथऐवेंट: (2) स्थान इनिव्यू :

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // Don't recognize taps in the buttons return (![self.button1 pointInside:[touch locationInView:self.button1] withEvent:nil] && ![self.button2 pointInside:[touch locationInView:self.button2] withEvent:nil] && ![self.button3 pointInside:[touch locationInView:self.button3] withEvent:nil]); } 

आईओएस 6.0 और उसके बाद में, डिफ़ॉल्ट नियंत्रण क्रिया अतिव्यापी जेस्चर पहचानकर्ता व्यवहार को रोकते हैं। उदाहरण के लिए, एक बटन के लिए डिफ़ॉल्ट क्रिया एक एकल टैप है यदि आपके पास एक टैप इशारे पहचानकर्ता है जो किसी बटन के पैरेंट व्यू से जुड़ा है, और उपयोगकर्ता बटन को टैप करता है, तो बटन की ऐक्शन मेथड इशारे पहचानकर्ता के बजाय टच इवेंट प्राप्त करता है। यह केवल जेस्चर मान्यता पर लागू होता है जो नियंत्रण के लिए डिफ़ॉल्ट कार्रवाई को ओवरलैप करता है, जिसमें शामिल हैं: …..

ऐप्पल के एपीआई डॉक्टर से

ये जवाब अधूरे थे इस बूलियन ऑपरेशन का उपयोग करने के लिए मुझे कई पदों को पढ़ना पड़ा।

आपकी * .h फ़ाइल में इसे जोड़ें

 @interface v1ViewController : UIViewController <UIGestureRecognizerDelegate> 

आपकी *। एम फाइल में यह जोड़ें

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { NSLog(@"went here ..."); if ([touch.view isKindOfClass:[UIControl class]]) { // we touched a button, slider, or other UIControl return NO; // ignore the touch } return YES; // handle the touch } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //tap gestrure UITapGestureRecognizer *tapGestRecog = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(screenTappedOnce)]; [tapGestRecog setNumberOfTapsRequired:1]; [self.view addGestureRecognizer:tapGestRecog]; // This line is very important. if You don't add it then your boolean operation will never get called tapGestRecog.delegate = self; } -(IBAction) screenTappedOnce { NSLog(@"screenTappedOnce ..."); } 

यहां केविन बलार्ड का त्वरित संस्करण है जो मेरे लिए काम करता है:

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if (scrollView.superview != nil) { if ((touch.view?.isDescendantOfView(scrollView)) != nil) { return false } } return true } 

आप UITapGestureRecognizer को निम्न बूलियन सेट करके अन्य ईवेंट (जैसे कि आपके बटन पर टैप) को रद्द करने से रोक सकते हैं:

  [tapRecognizer setCancelsTouchesInView:NO]; 

यदि आपका परिदृश्य ऐसा है:

आपके पास एक सरल दृश्य और कुछ UIButtons, UITextField नियंत्रण उस दृश्य के उप-दृश्य के रूप में जोड़े गए हैं। अब जब आप नियंत्रणों को छोड़कर दृश्य पर कहीं भी स्पर्श करते हैं, तब आप कुंजीपटल को खारिज करना चाहते हैं (आपके द्वारा जोड़े गए सबव्यूज़)

तो समाधान है:

अपने XYZViewController.m में निम्न विधि जोड़ें (जो आपके दृश्य है)

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 

@ Cdasher का उत्तर अनुकूलित करना, आपको मिलता है

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return ![touch.view isKindOfClass:[UIControl class]]; }