2011-06-15 11 views
16

मेरे पास नीचे दी गई छवि में UIViews का एक गुच्छा है। लाल/गुलाबी (अर्द्ध पारदर्शी) दृश्य दूसरों के शीर्ष पर है।UIGestureRecognizer के लिए सही दृश्य को विश्वसनीय रूप से कैसे ढूंढें?

  • लाल एक UISwipeGestureRecognizer है।
  • ग्रीन के पास UITapGestureRecognizer है।
  • ब्लू में कोई पहचानकर्ता नहीं है।

enter image description here

दिखाई (निचले बाएं) ग्रीन ट्रिगर अपने पहचानकर्ता की ओर से एक नल।

एक नल ग्रीन की छिपा भागों पर नहीं ट्रिगर अपने पहचानकर्ता (लाल ब्लॉक) करता है।

यह समस्या है: मैं ग्रीन ट्रिगर करना चाहता हूं। मैं यह कैसे कर सकता हूँ?

अभ्यास में, विचारों किसी भी क्रम में हो सकता है, किसी भी संख्या और एक दूसरे आदि की subviews हो लेकिन समस्या एक ही है:

मैं कैसे मज़बूती से ऊपरवाला का मानना ​​है कि इशारा संभाल कर सकते हैं पा सकते हैं (टैप या स्वाइप)?


मैं नीचे दिए गए कोड के साथ की कोशिश की। यह अच्छी तरह से सभी विचारों को पार करता है, लेकिन यह विफल रहता है क्योंकि यह नहीं पता कि यह ईवेंट स्वाइप या टैप का हिस्सा है या नहीं। तो विधि हमेशा लाल दृश्य देता है। अगर मैं लाल से स्वाइप-पहचानकर्ता को हटा देता हूं, तो कोड सही तरीके से काम करता है।

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *hitView = [super hitTest:point withEvent:event]; 
    if (hitView == self) 
    { 
     if (self.hasASwipeRecognizer) 
      return self; // What if this was a tap? 
     if (self.hasATapRecognizer) 
      return self; 
     else 
      return nil; 
    } 
    else 
     return hitView; 
} 

उत्तर

16

इन विचारों के लिए इशारा पहचानकर्ता जोड़ने का एक विकल्प मूल दृश्य में इशारा पहचानकर्ताओं को जोड़ना होगा और प्रतिनिधि विधि gestureRecognizer:shouldReceiveTouch: विधि का उपयोग करके उचित रूप से उपयोग मामलों को संभालना होगा।

पहचानें कि विशिष्ट पहचानकर्ता को स्पर्श प्राप्त करना चाहिए और YES वापस करना चाहिए। उदाहरण के लिए, यदि इशारा पहचानकर्ता पास हो जाता है तो एक स्वाइप पहचानकर्ता है तो जांच करें कि स्पर्श बिंदु हरे रंग के दृश्य में है और YES लौटाएं। अन्यथा NO लौटें।

यदि समान इशारा पहचानकर्ता हैं तो मैं सुझाव देता हूं कि आप एक संदर्भ रखें और इसके खिलाफ सत्यापित करें।

प्रयोग

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    CGPoint pointInView = [touch locationInView:gestureRecognizer.view]; 

    if ([gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]] 
     && CGRectContainsPoint(self.blueView.frame, pointInView)) { 
     return YES; 
    } 

    if ([gestureRecognizer isMemberOfClass:[UISwipeGestureRecognizer class]] 
     && CGRectContainsPoint(self.greenView.frame, pointInView)) { 
     return YES; 
    } 

    return NO; 
} 
+0

हाँ, यह के लिए महत्वपूर्ण है (जैसा कि आप कहते हैं) superview करने के लिए सभी recognizers जोड़ सकते हैं और वहाँ से संभालने के लिए। मेरा पदानुक्रम मनमाने ढंग से जटिल है (बहुभुज सूप सोचो) लेकिन यह विचार काम करता है। –

3

एक संभव समाधान शीर्ष लाल को देखने के लिए एक नल इशारा पहचानकर्ता को जोड़ने के लिए और उसके बाद जब भी आप नल मिलता है, जाँच नल बिंदु हरी दृष्टि से काटती है कि क्या होगा। यदि ऐसा है, तो उस दृश्य में टैप को अग्रेषित करें। यदि नहीं, तो टैप को अनदेखा करें।

3

मेरे समाधान है:

-(void)handleGesture:(UIGestureRecognizer*)gestureRecognizer { 
    CGPoint touchPoint = [tapGestureRecognizer locationInView:viewUnderTest]; 
    if ([viewUnderTest pointInside:touchPoint withEvent:nil]) { 
     NSLog(@"Hit done in view under test"); 
    } 
} 
संबंधित मुद्दे