2010-05-08 10 views
28

के बीच छुआ था या नहीं, मेरे पास 3 UIViews हैं, जो एक बड़े uiview के शीर्ष पर स्तरित हैं। मैं जानना चाहता हूं कि उपयोगकर्ता शीर्ष पर छूता है और अन्य लोगों की परवाह नहीं करता है। मेरे पास दूसरे UIView में दो बटन होंगे और तीसरे UIView में एक UITable होगा।पता लगाएं कि कुछ UIView को अन्य UIViews

समस्या यह है कि मैं उपयोगकर्ता दृश्य को पहले दृश्य पर बदलता हूं और यह काम करता है, लेकिन अन्य सभी विचार उसी तरह प्रतिक्रिया देते हैं, भले ही मैं इसे बंद कर दूं। अगर मैं self.view पर userInteractionEnabled अक्षम करता हूं तो उनमें से कोई भी जवाब नहीं देता है। मैं यह भी पता नहीं लगा सकता कि स्पर्श में कौन सा दृश्य स्पर्श किया गया थागेगन प्रतिनिधि विधि।

मेरे कोड:

UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)]; 
aView = userInteractionEnabled = YES; 
[self.view addSubview:aView]; 

UIView *bView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 50)]; 
bView.userInteractionEnabled = NO; 
[self.view addSubview:bView]; 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
//This gets called for a touch anywhere 
} 

उत्तर

58

क्रम में जांच करने के लिए एक और दृश्य के अंदर कुछ दृश्य छुआ था कि क्या आपको hitTest उपयोग कर सकते हैं।

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

स्पर्श के अपने कस्टम कार्यान्वयन में चेंग सेट स्पर्श में प्रत्येक स्पर्श की जांच करें।

- (CGPoint)locationInView:(UIView *)view; 

विधि, जहां दृश्य आपका सुपर व्यू (जिसमें अन्य दृश्य शामिल हैं) का उपयोग करके हिटटेस्ट विधि का बिंदु प्राप्त किया जा सकता है।

संपादित करें:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint locationPoint = [[touches anyObject] locationInView:self]; 
    UIView* viewYouWishToObtain = [self hitTest:locationPoint withEvent:event]; 
} 

मुझे आशा है कि यह मददगार था, पॉल

+0

क्षमा करें, मुझे पता है कि आप सही रास्ते पर हैं लेकिन मुझे यह समझने में थोड़ा परेशानी हो रही है कि आप क्या कह रहे हैं। मुझे आपके स्थान से स्पर्शों से छूने वाला बिंदु मिल रहा है IView और मैं तकनीकी रूप से काम कर सकता हूं कि उपयोगकर्ता ने इस से छू लिया है, लेकिन मुझे यकीन नहीं है कि यह हिटटेस्ट – Rudiger

+2

कहलाता है, यह ध्यान दिया जाना चाहिए कि 'locationInView:' को ' nil' आपको मुख्य विंडो के समन्वय स्थान में 'CGPoint' स्थान देता है। –

26

मेरे मामले में UIView मैं खोजना चाहते थे hitTest द्वारा वापस नहीं कर रहा था: यहाँ एक तेजी से कस्टम कार्यान्वयन है। लेकिन निम्न कोड में बेहतर काम किया:

CGPoint locationPoint = [[touches anyObject] locationInView:self.view]; 
    CGPoint viewPoint = [myImage convertPoint:locationPoint fromView:self.view]; 
    if ([myImage pointInside:viewPoint withEvent:event]) { 
     do something 
    } 
+0

मैं भी स्वीकृत उत्तर के साथ मुद्दों में भाग गया। किसी भी कारण से, यह भी काम किया। ध्यान दें कि मैं UIImageView पर हिट का पता लगाने की कोशिश भी कर रहा था, न कि केवल एक UIView अगर यह बिल्कुल प्रासंगिक है। –

8

में touchesBegan जाँच लें कि छुआ दृश्य एक तुम चाहते है, जब मैं पहचान उपयोगकर्ता एक विशिष्ट imageView छुआ अगर करने की कोशिश की मेरे लिए समस्या हल हो।

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

    if ([touch view] == imageView) { 
     ... your code to handle the touch 
    } 
    ... 

आप दृश्य diamensions के लिए सामग्री को समायोजित, तो यह और भी क्षेत्र में स्पर्श घटना पहचान लेंगे तदनुसार अन्यथा दृश्य आकार बदलने के लिए सुनिश्चित करें कि जहां ध्यान में रखते हुए इतना सामग्री में वहाँ। मेरे मामले में जब मैंने UIViewContentModeScaleAspectFit के साथ छवि अनुपात रखने की कोशिश की, हालांकि छवि को "सफेद रिक्त स्थान" क्षेत्रों में आवश्यकतानुसार समायोजित किया गया था, स्पर्श ईवेंट भी कैच किया गया था।

12

यह भी निम्न तरीके से किया जा सकता है।

सबसे पहले ध्यान में रखते हुए टच के स्थान आप के बारे में परवाह लगता है:

BOOL withinBounds = CGRectContainsPoint(viewYouCareAbout.bounds, location); 

तो अगर यह सीमा के भीतर है:

CGPoint location = [touches.anyObject locationInView:viewYouCareAbout]; 

फिर अगर बिंदु दृश्य की सीमा के भीतर है यह देखने के , अपनी कार्रवाई करें।

CGRectContainsPoint(viewYouCareAbout.bounds, [touches.anyObject locationInView:viewYouCareAbout]) 
8

तेज कोड:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let touch = touches.first { 
      if touch.view == self.view { 
       self.hideInView() 
      } else { 
       return 
      } 

     } 
    } 
+0

तेजी से के लिए महान जवाब। ऊपर वोट के साथ प्यार साझा करना। –

0

यह मेरे लिए काम किया:

यह एक बयान है, जो उदाहरण के लिए, एक अगर बयान के भीतर सीधे इस्तेमाल किया जा सकता है के साथ किया जा सकता है

func respondToGesture(gesture: UIGestureRecognizer) { 
    let containsPoint = CGRectContainsPoint(targetView.bounds, gesture.locationInView(targetView)) 
} 
संबंधित मुद्दे