2012-11-16 23 views
5

मैं निम्नलिखित प्राप्त करना चाहता हूं।एक UIView बनाना जो नल को कैप्चर करता है, लेकिन अन्य सभी संकेतों के लिए पारदर्शी है

परिदृश्य: उपयोगकर्ता आईओएस कीबोर्ड ऑन-स्क्रीन है जबकि उपयोगकर्ता किसी विशेष टेक्स्ट फ़ील्ड में टाइप कर रहा है। कुंजीपटल को खारिज करने के लिए उपयोगकर्ता कीबोर्ड और टेक्स्ट फ़ील्ड के बाहर कहीं भी टैप कर सकता है (दिखाई देने वाले किसी भी बटन को सक्रिय किए बिना)। इसके अलावा, उपयोगकर्ता कीबोर्ड के बाहर ड्रैग खींच सकता है और स्क्रॉल करने योग्य दृश्यों की कुछ व्यवस्था पर सामान्य ड्रैग व्यवहार का निरीक्षण कर सकता है।

वैचारिक रूप से, मैं एक "कवर" UIView स्क्रीन के अधिकांश हिस्से में जो बर्ताव रखकर कर रहा हूँ ऐसा है कि: उपयोगकर्ता कवर पर टैप करता

  1. है, तो मुझे लगता है कि नल पर कब्जा (ताकि मैं , उदाहरण के लिए, कीबोर्ड को खारिज करें)। UIView सबक्लास में टैप इवेंट्स को अवरुद्ध करके या टैप जेस्चर पहचानकर्ता का उपयोग करके हासिल करना आसान है।

  2. उपयोगकर्ता कवर पर खींच लेता है, तो कवर या आगे इन छूता है पर ध्यान नहीं देता; इन्हें परतों के नीचे प्राप्त किया जाता है जैसे वे कवर के बिना होते।

तो: उपयोगकर्ता कवर के नीचे सामग्री को स्क्रॉल करने में सक्षम होना चाहिए, लेकिन कवर के नीचे सामग्री टैप नहीं करना चाहिए। कीबोर्ड और टेक्स्ट फ़ील्ड के "बाहर" टैप को कीबोर्ड (और कवर) को खारिज कर देना चाहिए, लेकिन कुछ भी सक्रिय नहीं करना चाहिए।

मैं इसे कैसे प्राप्त कर सकता हूं?

+0

आपको छूने के लिए विधि के तरीके को लागू करने पर विचार करना होगा और स्वाइप करने के लिए इसके पीछे के विचारों के स्पर्शों को पार करना होगा। '- (शून्य) स्पर्श करता हैगान: (एनएसएसएटी *) के साथ छूता है: (UIEvent *) घटना { [अन्य दृश्य स्पर्श करेंगन: स्पर्श के साथ स्पर्श: घटना]; } 'एक और तरीका लागू करना है, UIPanGestureRecognizer और सेट cancelsTouchesInView = YES' UIPanGestureRecognizer * gr = [[UIPanGestureRecognizer alloc] initWithTarget: self action: @selector (handlePan)]; [gr setCancelsTouchesInView: YES]; [myButton addGestureRecognizer: gr]; [जीआर रिलीज]; ' – iDev

+1

@ एमजेएच, क्या आपको कभी इसका समाधान मिला? – kpozin

उत्तर

0

1: को देखने के लिए एक नल इशारा पहचानकर्ता जोड़ें:

//Adding tap gesture 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
    tapGesture.numberOfTapsRequired = 1; 
    [self.view addGestureRecognizer:tapGesture]; 

2: handleTapGesture में आप कुंजीपटल

- (void)handleTapGesture:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateRecognized) { 
     //Resign first responder for keyboard here 
    } 
} 

सविस्तार जवाब ऊपर पर थोड़ा की resignFirstResponder। UIGestureRecognizerStateRecognized सुनिश्चित करता है कि यह एक टैब ईवेंट है जो पहचाना जाता है।

क्या यह कार्यक्षमता है जिसके बाद आप?

+0

उनका सवाल यह है कि "यदि उपयोगकर्ता कवर पर ड्रैग करता है, तो कवर सभी स्पर्शों को अनदेखा करता है; ये परतों के नीचे प्राप्त होते हैं जैसे कि वे कवर के बिना होते।" उन्होंने पहले ही पता लगाया है कि स्पर्श का पता कैसे लगाया जाए। – iDev

+0

यदि 'UIView' टैप को पहचानने में सक्षम है, तो इसका '.userInteractionEnabled'' YES' होना चाहिए और इसलिए यह सभी स्पर्श घटनाओं को खाता है, जो ड्रैग को नीचे जो कुछ भी पहचाना जाता है उसे पहचानने से रोकता है। – mjh

2

टैप जेस्चर हमेशा की तरह जोड़ें:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; 
[self.view addGestureRecognizer:tapGesture]; 

लेकिन क्या आप के लिए देख जा सकता है यह है:

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

प्रलेखन कहते हैं: इस विधि या तो द्वारा जब एक इशारे की मान्यता कहा जाता है इशारा रिकॉग्नाइज़र या अन्य जेश्चरर रिकॉग्नाइज़र अन्य इशारा पहचानकर्ता को अपने इशारे को पहचानने से रोक देगा। (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate)

इस तरह, आप सुनिश्चित हो सकते हैं कि यह पूरी तरह पारदर्शी है, और यह भी कि आपके पहचानकर्ता को बुलाए जाने से कुछ भी नहीं रोकेगा।

0

जो सभी छूता है उसे प्राप्त अग्रेषित करता है एक कस्टम दृश्य:

class CustomView: UIView { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 

     var hitView = super.hitTest(point, withEvent: event) 

     if hitView == self { 
      return nil 
     } 

     return hitView 
    }  
} 

वहां से आप सिर्फ नल इशारों का उपयोग करने के लिए अलग अलग तरीकों से जा सकते हैं। या तो अपने स्पर्श के लिए UIEvent का निरीक्षण करें, या एक इशारा पहचानकर्ता का उपयोग करें।