2009-01-04 16 views
11

में एक सीजीपीओइंट को एक यूआईवी व्यू से दूसरे में और एक कैलियर से दूसरे में स्थानांतरित करने के तरीके हैं। मुझे एक UIView के समन्वय प्रणाली से एक CALAYER समन्वय प्रणाली में एक CGPoint बदलने का कोई तरीका नहीं मिल रहा है।एक सीआईवीपीओएन को एक यूआईवीवी समन्वय प्रणाली से एक कैलियर समन्वय प्रणाली

क्या परत और उसके होस्ट दृश्य में समान समन्वय प्रणाली है? क्या मुझे उनके बीच अंक बदलने की ज़रूरत है?

धन्यवाद, कोरी

[संपादित करें]

जवाब के लिए धन्यवाद! आईफोन और मैक पर सीए के बीच मतभेद/समानताओं पर जानकारी प्राप्त करना मुश्किल है। मुझे आश्चर्य है कि मुझे इस मुद्दे को किसी भी ऐप्पल दस्तावेज़ीकरण में सीधे संबोधित नहीं किया जा सका।

मैं इस समस्या का पीछा कर रहा था कि मैं समस्या निवारण कर रहा हूं, और यह अब तक का सबसे अच्छा अनुमान था, लेकिन मुझे लगता है कि मैं गलत पेड़ को भड़क रहा हूं। समन्वय प्रणाली में एक ही है, तो मैं एक और मुद्दा है ...

वास्तविक मुद्दा मैं स्टैक ओवरफ़्लो पर यहां पाया जा सकता हो रहा है: layer hit test only returning layer when bottom half of layer is touched

उत्तर

4

आप को बदलने अगर आप उनके समन्वय प्रणाली फ्लिप करना चाहते हैं उचित करने के लिए CALayers की transform संपत्ति सेट कर सकते हैं, लेकिन ध्यान दें कि यह शायद contents के अपने ड्राइंग फ्लिप के साथ-साथ होगा (मैं परीक्षण नहीं किया है कि, लेकिन यह समझ में आता है यह सच होगा)। मेरा दावा है कि एक UIView के साथ जुड़े CALayer एक ही समन्वय प्रणाली साझा करता है वास्तव में पूरी तरह से गलत हो सकता है। यह भी हो सकता है कि कैलियर एक ही समन्वय प्रणाली का उपयोग UIViews के रूप में करते हैं (यानी वे लंबवत रूप से फ़्लिप नहीं होते हैं), लेकिन मैंने सोचा कि वे कोरग्राफिक्स यूआईकिट के सापेक्ष फ़्लिप किए गए समन्वय प्रणाली का उपयोग करते हैं।

परीक्षण करने का एक आसान तरीका स्क्रीन के आकार वाले कैलियर को दृश्य की परत के उपन्यास के रूप में जोड़ना होगा, फिर उसमें एक छोटे से कैलियर को एक उपन्यास के रूप में जोड़ें। आप इसे (0, 0, 320, 100) पर दिखाने के लिए सेट कर सकते हैं और देख सकते हैं कि यह आईफोन की स्क्रीन के ऊपर या नीचे दिखाया गया है या नहीं। यह आपको बताएगा कि वाई अक्ष कोरएनीमेशन के लिए किस दिशा में जाती है।

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    CALayer *rootLayer = [CALayer layer]; 
    rootLayer.frame = self.view.layer.bounds; 
    CALayer *smallLayer = [CALayer layer]; 
    smallLayer.frame = CGRectMake(0, 0, rootLayer.bounds.size.width, 50); 
    smallLayer.backgroundColor = [UIColor blueColor].CGColor; 
    [rootLayer addSublayer:smallLayer]; 
    [self.view.layer addSublayer:rootLayer]; 
} 

मैं सिर्फ इस परीक्षण अपने आप को प्रदर्शन किया, और ऐसा लगता है CALayers वास्तव में UIViews के रूप में ही समन्वय प्रणाली का उपयोग करें, तो मेरे दावे CALayer के फ्लिप कि Y अक्ष निश्चित रूप से गलत है। हालांकि, यदि आप सीधे कोरग्राफिक्स के साथ चित्रित करते हैं, तो ध्यान रखें कि कोरग्राफिक्स फ़्लिप किए गए वाई अक्ष का उपयोग करता है (हालांकि जब UIView सबक्लास में चित्रित होता है या, मुझे लगता है कि एक कैलियर प्रतिनिधि, कोरग्राफिक्स संदर्भ पहले से ही UIView के मिलान के लिए फ़्लिप हो चुका है (या कैलियर) समन्वय प्रणाली)।

तो संक्षिप्त उत्तर, यदि आपने इसे अभी तक बनाया है, तो कैलियर के समन्वय प्रणाली को इसके संबंधित UIView के लिए समन्वय प्रणाली से मेल खाना चाहिए।

+0

केविन, अगर आप समय है कि आप अपने मुख्य नीचे अपनी पोस्ट में सूचीबद्ध धागा को देख कर मन होगा। आप इस में बहुत समझदार प्रतीत होते हैं और किसी भी अंतर्दृष्टि की सराहना की जाती है। धन्यवाद फिर से –

-2

मेरा मानना ​​है कि दो ही समन्वय प्रणाली है।

0

मेरा मानना ​​है कि एक UIView की समन्वय प्रणाली और इसकी संबद्ध परत समान होनी चाहिए। हालांकि, यदि आप परतें स्वयं बनाते हैं, तो समन्वय प्रणाली लंबवत रूप से फ़्लिप होती है।

13

hitTest के लिए दस्तावेज़ का कहना है:

/* Returns the farthest descendant of the layer containing point 'p'. 
* Siblings are searched in top-to-bottom order. 'p' is in the 
* coordinate system of the receiver's superlayer. */ 

तो तुम क्या करने की जरूरत (कुछ इस तरह):

CGPoint thePoint = [touch locationInView:self]; 
thePoint = [self.layer convertPoint:thePoint toLayer:self.layer.superlayer]; 
CALayer *theLayer = [self.layer hitTest:thePoint]; 
+0

यह अजीब बात है क्योंकि 'self.layer' वास्तव में एक रूट परत है, इसलिए इसमें कोई' सुपरलेयर 'नहीं होना चाहिए। लेकिन यह वास्तव में काम करता है। धन्यवाद! – Rizo

1

मेरे परीक्षण से मुझे पता चला गया है sublayers का हिस्सा है कि एक ही समन्वय प्रणाली क्योंकि यह मूल परत है और इसलिए यदि आप UIView परत में sublayer जोड़ रहे हैं तो वे समान समन्वय प्रणाली साझा करेंगे।

यदि आप अभी भी समन्वय प्रणाली को फ़्लिप करना चाहते हैं तो यह मूल ऊपरी बाएं कोने में है, आपको इस परिवर्तन का उपयोग करना चाहिए जो वाई अक्ष को फ़्लिप करता है। (एक्स, वाई, 1) = (एक्स ', वाई', 1) * [1 0 0], [0 -1 0], [0 ऊँचाइ 1]

जो कोड में अनुवाद किया है: [your_layer setAffineTransform: CGAffineTransformMake (1,0,0, -1,0, ऊँचाइ)];

4

ऐप्पल दस्तावेज के संदर्भ में, मुझे Core Animation Programming Guide (2008-11-13) के परत समन्वय प्रणाली खंड में "आईफोन ओएस नोट" मिला।

एक UIView इंस्टेंस की डिफ़ॉल्ट रूट परत एक फ़्लिप समन्वय प्रणाली का उपयोग करती है जो UIView इंस्टेंस की डिफ़ॉल्ट समन्वय प्रणाली से मेल खाती है- मूल शीर्ष-बाएं में है और मान नीचे और दाईं ओर बढ़ते हैं। कैलियर को तुरंत चालू करके बनाए गए परत सीधे मानक कोर एनीमेशन समन्वय प्रणाली का उपयोग करते हैं।

0
Methods that fixing frames and points 
- (CGRect) fixRect:(CGRect)rect inRect:(CGRect)container 
{ 
    CGRect frame = rect; 
    frame.origin.y = container.size.height - frame.origin.y - frame.size.height; 
    return frame; 
} 
- (CGPoint) fixPoint:(CGPoint)point fromPoint:(CGSize)containerSize 
{ 
    CGPoint frame = point; 
    frame.y = size.height - frame.y; 
    return frame; 
} 
संबंधित मुद्दे