2010-09-09 10 views
9

की subview में हुई UIView का एक उपवर्ग में मैं इस है:iphone - निर्धारित करता है, तो स्पर्श एक UIView

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
    { 
     if(touch occurred in a subview){ 
     return YES; 
     } 

     return NO; 
    } 

क्या मैं अगर बयान में रख सकते हैं? मैं यह जानना चाहता हूं कि एक सबव्यूव में कोई स्पर्श हुआ है, भले ही यह UIView के फ्रेम के भीतर है या नहीं।

उत्तर

2
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([self hitTest:point withEvent:nil] == yourSubclass) 
} 

विधि - (UIView *) hitTest: (CGPoint) इंगित withEvent: (UIEvent *) घटना (अपने आप सहित) दृश्य पदानुक्रम में रिसीवर की सब से अधिक दूर वंशज है कि एक निर्दिष्ट बिंदु शामिल हैं देता है। मैंने जो किया वह आपके सबव्यू के साथ सबसे दूरदर्शी दृश्य की तुलना के परिणाम को वापस कर देता है। यदि आपके सबव्यू में भी सबव्यूव हैं तो यह आपके लिए काम नहीं कर सकता है। तो क्या आपको लगता है कि मामले में क्या करना चाहता है:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass]) 
} 
+0

लेकिन इस विधि UIView का एक उपवर्ग है, इसलिए इस दुर्घटनाओं: – sol

+0

माफ करना, मुझे लगता है मैं एक जवाब जोड़ने के लिए समझाने के लिए की जरूरत है - नीचे देखें – sol

0

लेकिन इस विधि UIView का एक उपवर्ग में है, इसलिए इस दुर्घटनाओं:

return ([[self hitTest:point withEvent:nil] isDescendantOfView:self]) 
मुमकिन अनंत प्रत्यावर्तन की वजह से

मैं इस कोशिश की:

NSSet* touches = [event allTouches]; 
UITouch* touch = [touches anyObject]; 

return ([touch.view isDescendantOfView:self] || touch.view == self); 

लेकिन यह हमेशा रिटर्न नहीं

+0

यह मेरे लिए UIView सबक्लास में काम करता है: - (शून्य) स्पर्श करता है: (NSSet *) स्पर्श के साथ स्पर्श करता है: (UIEvent *) ईवेंट { \t \t यूआईटीच * स्पर्श = [किसी भी ऑब्जेक्ट को छूता है]; \t अगर ([touch.view isDescendantOfView: mySubView]) { \t \t NSLog (@ "YUP"); \t} \t अन्य { \t \t एनएसएलओजी (@ "एनओपीई"); \t} } –

+0

यह दृश्य के फ्रेम के बाहर छूने का पता नहीं लगाता है - यह सबसे महत्वपूर्ण हिस्सा है जिसे मैं ढूंढ रहा हूं। – sol

12

कि प्रयास करें:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    return CGRectContainsPoint(subview.frame, point); 
} 

आप हाँ वापस जाने के लिए चाहते हैं, तो स्पर्श दृश्य के अंदर जगह है जहाँ आप को लागू इस विधि का उपयोग करें, इस कोड का उपयोग करें: (यदि आप कंटेनर की सीमाओं के बाहर स्थित एक सबव्यू में इशारा पहचानकर्ता जोड़ना चाहते हैं)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if ([super pointInside:point withEvent:event]) 
    { 
     return YES; 
    } 
    else 
    { 
     return CGRectContainsPoint(subview.frame, point); 
    } 
} 
1

आज़माएं:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    if([touch.view isKindOfClass:[self class]]) { 
    return YES; 
    } 
    return NO; 
} 
0

स्विफ्ट संस्करण:

var yourSubview: UIView! 

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
    return subviewAtPoint(point) == yourSubview 
    } 

    private func subviewAtPoint(point: CGPoint) -> UIView? { 
    for subview in subviews { 
     let view = subview.hitTest(point, withEvent: nil) 
     if view != nil { 
     return view 
     } 
    } 
    return nil 
    } 
संबंधित मुद्दे