2010-02-04 13 views
6

मैं कोको टच एप्लिकेशन पर काम कर रहा था, और यह देखने के द्वारा स्पर्शों को संभालने की कोशिश कर रहा था कि दृश्य की परत का कौन सा उपन्यास छुआ था। मेरा नियंत्रक का कोड इस तरह दिखता था:हिट-परीक्षण के लिए किसी को कैलियर की प्रेजेंटेशन लेयर का उपयोग क्यों करना है?

CALayer *hitLayer = [self.view.layer hitTest:point]; 

यह काम नहीं कर रहा था। यह काम करेगा अगर मैं sublayers की बोतलों पर टैप किया, लेकिन शीर्ष पर नहीं। बाल खींच रहा है और Googling के एक घंटे के बाद, मैं अंत में पता लगा है कि यह काम करता है अगर एक प्रस्तुति परत का उपयोग करता है हिट परीक्षण परत खुद के बजाय करने के लिए:

CALayer *hitLayer = [self.view.layer.presentationLayer hitTest:point]; 

तो, मुझे मेरी समस्या हल कर लिया है , लेकिन मेरा सवाल है: क्यों?

मैंने कोर एनीमेशन गाइड के माध्यम से पढ़ा है, और मैं समझता हूं कि प्रस्तुतिकरण पेड़ और प्रतिपादन पेड़ वस्तु-मॉडल पेड़ से भिन्न हो सकता है। लेकिन मुझे समझ में नहीं आता कि प्रेजेंटेशन पेड़ (स्पष्ट रूप से) अलग हिट-परीक्षण व्यवहार क्यों करेगा। प्रेजेंटेशन पेड़ और ऑब्जेक्ट-मॉडल में समान फ्रेम, सीमाएं आदि नहीं होंगी?

+0

self.view की कक्षा क्या है: UIView या CALayer? –

+0

self.view एक UIView है। मैंने उपरोक्त कोड को "self.view.layer" का उपयोग करने के लिए सही किया है जैसा कि होना चाहिए था। –

उत्तर

4

CALayer documentation के अनुसार, उपयोगकर्ता को प्रस्तुत किए जाने वाले मॉडल और प्रस्तुति वृक्ष के बीच एक अंतर होता है (चल रहे एनीमेशन के आधार पर)।

उदाहरण के लिए, एक hitTest भेजने: हिट परीक्षण के लिए, वहाँ presentationLayer विधि में एक संदर्भ है presentationLayer को संदेश होगा क्वेरी परत पेड़ की प्रस्तुति मूल्यों।

तो मुझे संदेह है कि केवल प्रस्तुति परत में हिट टेस्ट करने के लिए सही ज्यामिति जानकारी है।

3

क्रिस्टोफर, मेरे पास भी एक बहुत ही समान समस्या थी। हालांकि, जब मैंने बिंदु को सुपर परत या सुपर व्यू समन्वय प्रणाली में परिवर्तित कर दिया तो यह पूरी तरह से काम करता था। मैंने प्रस्तुति परत का उपयोग नहीं किया।

//Identify the touch point in the view. Using UITapRecognizer 
CGPoint loc = [recognizer locationInView:recognizer.view]; 

//convert the point to superview co-ordinates and then identify the layer using hit test. 
CALayer *layer = [self.layer hitTest:[self convertPoint:loc toView:self.superview]]; 

यह मैं परत है कि छुआ था, कम से कम अब के लिए देता है। हमें बताएं कि क्या आपको लगता है कि यह एक गलत दृष्टिकोण है और मुझे इसके बजाय प्रस्तुति-परत का उपयोग करना चाहिए।