दिलचस्प पोस्ट
मैं आईआईएस के लिए आईआईएस को एचटीएमएल 5 मोड में एन्जिलरजेएस एप्लीकेशन में लिखने के लिए कैसे कॉन्फ़िगर करूं? सीएमडी के साथ फ़ाइल पथ से फ़ोल्डर पथ कैसे प्राप्त करें किसी नियंत्रण के निर्माता से डिजाइन मोड का पता लगा रहा है Matplotlib (हिस्टोग्राम) में बिन आकार क्या "जीआईटी मर्ज -स हमारा" का "उनका" संस्करण है? सरणी में ऑब्जेक्ट ढूंढें? PHP में बहु-आयामी सरणी से डुप्लिकेट मान कैसे निकालें IPhone ऐप में कस्टम फोंट कैसे जोड़ें? ऑरेंज प्रॉपर्टी का उपयोग चर का उपयोग कैसे करें कैसे, यदि बिल्कुल, Erlang प्रक्रियाओं को कर्नेल थ्रेड्स के लिए मानचित्र करते हैं? एक फ़ील्ड या किसी अन्य (XOR) की उपस्थिति मान्य करें छवि को आधार64 में परिवर्तित करना SASS का उपयोग करते समय मैं एक अलग निर्देशिका से एक फ़ाइल कैसे आयात कर सकता हूं? एक प्रोग्राम अपने स्वयं के निष्पादन योग्य कैसे हटा सकता है आप यूनिट परीक्षण के लिए सी # में फ़ाइल सिस्टम कैसे बना सकते हैं?

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

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

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

वेब के समाधान से एकत्रित समाधान "एक दृश्य के अंदर 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]]; }