2012-12-20 18 views
8

पर दो UIView ऑब्जेक्ट्स के चौराहे का पता लगाना मुझे अपने UIView ऑब्जेक्ट्स के चौराहे का पता लगाने में समस्या है।विभिन्न पर्यवेक्षण

है यही कारण है कि मैं नीचे का इस्तेमाल किया है:

चौराहे के लिए दो वस्तु मैं यह पता लगाने की एक अनुवाद करने के लिए कैसे की जरूरत है एक और निर्देशांक प्रणाली के लिए पहली superview से प्रणाली समन्वय करता है।

मैंने इस दृष्टिकोण का उपयोग किया है: - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view यहां वर्णित link

जैसा कि मुझे पता है कि इस विधि का उपयोग करना बहुत आसान है। लेकिन विभिन्न मामलों में दस्तावेज़ीकरण में थोड़ा सा विवरण होना मुश्किल है (लेकिन शायद मेरे लिए)।

यह मेरी छवियों की संरचना है जो नीचे दी गई छवि पर दिखाया गया है। मुझे ड्रैग और ड्रॉप ऑब्जेक्ट के लिए पहले से ही सभी विधियां मिल चुकी हैं। लेकिन मुझे यह पता लगाने की जरूरत है कि UIView और UIViewबी के लिए छेड़छाड़ कैसे प्राप्त करें। मदद के लिए धन्यवाद।

enter image description here

+0

आप पदानुक्रम का वर्णन कृपया सकते हैं विस्तृत रूप में? क्या एक पर्यवेक्षक में ए और बी दोनों विचार होते हैं? –

+0

+1 आपके चित्रण पर परिप्रेक्ष्य skew के लिए – Till

+0

प्रतिक्रिया लोगों के लिए धन्यवाद। तो पर्यवेक्षण के बारे में - ए और बी विचारों के लिए दो अलग-अलग पर्यवेक्षी हैं। जब मैं बी को खींच रहा हूं तो निर्देशांक केवल पर्यवेक्षण के लिए संबंधित हो रहे हैं जहां बी व्यू रखा गया है। इसलिए बी को निर्देशांक के लिए समन्वय करने के लिए जहां एक दृश्य रखा गया है, मुझे UIView क्लास में घोषित कई कनवर्ट्रेट विधि का उपयोग करने की आवश्यकता है, इसके बाद मुझे परिवर्तित कॉर्ड और ए व्यू रेक्ट के साथ छेड़छाड़ की आवश्यकता है। समझने के लिए बहुत आसान है, लेकिन यह सामान बनाने के लिए बहुत आसान नहीं है) –

उत्तर

5

मैं इस समाधान को लागू किया है:

- (void)putComponent:(NSNotification *)notif { 
    // Catch B UIView. 
    UIView *view = [notif object]; 
    // Convertation. [self superview] - is view wher A UIView is placed. 
    CGRect convertedRect = [[self superview] convertRect:view.frame fromView:[view superview]]; 
    // Find center point. 
    CGPoint point; 
    point.x = convertedRect.origin.x + (convertedRect.size.width/2.0f); 
    point.y = convertedRect.origin.y + (convertedRect.size.height/2.0f); 
    // Find if CGRect (self.frame) contains a point (center of B UIView) 
    BOOL contains = CGRectContainsPoint(self.frame, point); 
    if (contains) { 
     NSLog(@"intersect here"); 
    } 
} 
+1

[CGGeometry'] में https://Gveloper.apple.com/library/mac/#documentation/ में 'CGRectGetMidX' और 'CGRectGetMidY' फ़ंक्शंस देखें) graphicsimaging/संदर्भ/CGGeometry/संदर्भ/reference.html)। –

+0

यदि आप वास्तव में चौराहे के लिए परीक्षण करना चाहते हैं, तो यह एक आयत के ** केंद्र ** का परीक्षण करने के लिए पर्याप्त नहीं है। – Nate

+0

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

0

मुझे लगता है कि यह अपने जवाब में कोड के बराबर है, लेकिन काफी कम:

- (void)putComponent:(NSNotification *)note { 
    UIView *other = note.object; 
    CGPoint otherCenterInMe = [self convertPoint:other.center fromView:other.superview]; 
    if ([self pointInside:otherCenterInMe withEvent:nil]) { 
     NSLog(@"intersect here"); 
    } 
} 
+0

मुझे पता है कि पोस्टर का जवाब वही काम करता है, लेकिन सामान्य रूप से, एक आयताकार के केंद्र के लिए परीक्षण एक वैध चौराहे परीक्षण नहीं है। – Nate

संबंधित मुद्दे