2012-06-06 32 views
7

यह ज्ञात है कि परतों के zPosition केवल यह निर्धारित करता है कि कौन सी परत परत को कवर करती है। चाहे यह 10 या 1000 का zPosition है, इसकी स्थिति प्रभावित नहीं होगी।आईओएस पर, एक परत के sublayerTransform क्यों सेट कर रहा है खुद को CATranformLayer की तरह कार्य करने के लिए बारी?

वह है, जब तक कि हम use CATransformLayer to contain those layers नहीं हैं, तब उन परतों के zPosition परतों की स्थिति को प्रभावित करेंगे।

हालांकि, निम्नलिखित कोड आईओएस 5.1.1 में चल zPosition परतों की स्थिति को बदल पड़ता है ... आप इसे एक नए एकल देखें App में प्रयास करें, और ViewController.m के लिए निम्न कोड जोड़ सकते हैं। layer288 से 188 में बदल दिया गया है, तो हम देख सकते हैं कि परत तदनुसार चलता है। तो कोड में CATransformLayer नहीं है; ऐसा क्यों व्यवहार करेगा? (कृपया ऐप्पल दस्तावेज़ या किसी संदर्भ को उद्धृत करें)।

यह भी संबंधित है, यदि लाइन self.view.layer.sublayerTransform = transform3D;self.view.layer.transform = transform3D; में बदल दी गई है तो zPosition स्थिति पर कोई प्रभाव नहीं पड़ेगा। लेकिन according to the Apple docs, transform and sublayerTransform only differ in whether self is transformed or not:

दो परत गुण निर्दिष्ट मैट्रिक्स परिणत: transform और sublayerTransformtransform property द्वारा निर्दिष्ट मैट्रिक्स परत और उसके sublayers परत के anchorPoint से संबंधित है। [...] sublayerTransform द्वारा निर्दिष्ट मैट्रिक्स केवल परत के बजाय परत के sublayers, पर लागू होता है।

तो यह है कि क्यों बदल रहा है कि self.view.layer एक CATransformLayer की तरह काम करने के लिए कारण होगा अजीब है।

-(void) viewDidAppear:(BOOL)animated { 

    CATransform3D transform3D = CATransform3DIdentity; 

    transform3D.m34 = -1.0/1000; 

    transform3D = CATransform3DRotate(transform3D, M_PI/4, 0, 1, 0); 

    self.view.layer.sublayerTransform = transform3D; 

    CALayer *layer1 = [[CALayer alloc] init]; 
    layer1.zPosition = 33; 
    layer1.frame = CGRectMake(100, 100, 100, 100); 
    layer1.backgroundColor = [[UIColor orangeColor] CGColor]; 

    [self.view.layer addSublayer:layer1]; 

    CALayer *layer2 = [[CALayer alloc] init]; 
    layer2.zPosition = 88; 
    layer2.frame = CGRectMake(100, 120, 100, 100); 
    layer2.backgroundColor = [[UIColor yellowColor] CGColor]; 

    [self.view.layer addSublayer:layer2];  

} 

उत्तर

0

हम एक परत समन्वय के रूप में परत में सोच सकते हैं, जब हम एक परत transfrom3D बनाने के लिए, यह 3 डी बन समन्वय है, लेकिन इसकी उप-परत अभी भी 2 डी के रूप में दिखाने के लिए, लेकिन जब उप-परत transfrom3D निर्धारित करते हैं, परत अपने सभी उप-परत कर देगा 3D.it के रूप में दिखाएं रोटेशन

1

परत transform और sublayerTransform गुणों के बीच अंतर को वास्तव में समझने के लिए, मुझे लगता है कि इसमें 3 डी सामग्री वाले टीवी को देखने के संदर्भ में यह सोचना उपयोगी है। my modified version of your code in Swift playground देखें।

यहां प्रारंभ संस्करण है: आपके पास एक टीवी है जिसमें कोई परिप्रेक्ष्य परिवर्तन नहीं है। इसलिए, आपकी सामग्री (दो नारंगी और पीले रंग के sublayers) y-axis के चारों ओर घूर्णन के साथ भी फ्लैट दिखता है। एक ऑर्थोग्राफिक प्रक्षेपण के लिए आप क्या उम्मीद करेंगे।

.none option

हालांकि, अगर आप अपने टीवी अभी भी पकड़ है, लेकिन परिप्रेक्ष्य प्रक्षेपण के साथ नीचे अपनी सामग्री को बदलने, अब आप तुरंत अपनी सामग्री की गहराई को देखते हैं। आपके द्वारा जोड़े गए sublayers के zPosition आपको गहराई की भावना देने में वास्तव में एक महत्वपूर्ण भूमिका निभाते हैं, और यह सही है its definition द्वारा। यह ठीक है कि कैसे sublayerTransform काम करता है: केवल सामग्री को बदलता है, लेकिन टीवी स्वयं ही नहीं।

.sublayerTransform option

अब, क्या यह अगर मैं transform बजाय sublayerTranform का उपयोग की तरह लग रहे हैं? बस सामग्री बदलने नहीं कल्पना कीजिए, लेकिन संपूर्ण टीवी बारी बारी से स्क्रीन से जुड़ी सामग्री के साथ-साथ, और आप अपेक्षित परिणाम देखना चाहते हैं:

.transform option

तो, हाँ, जाहिरा तौर पर transform और sublayerTransform व्यवहार जब sublayers के zPosition का इलाज करने की बात आती है तो काफी अलग है, हालांकि the documentation doesn't explicitly say so। एक sublayer zPosition का उसके माता-पिता के transform पर कोई प्रभाव नहीं पड़ता है, लेकिन इसके माता-पिता के sublayerTransform पर सामान्य 3 डी प्रभाव प्रदान करता है।