2012-01-17 8 views
5

छवियों के निम्नलिखित प्रगति पर एक नज़र डालें:

enter image description here enter image description here enter image description hereदृश्य परिवर्तन की कमी को कम करने के लिए CATransform3D का उपयोग करके यह परिवर्तन क्यों है?

यहाँ क्या हो रहा है पहले मैं "बेसबॉल" चयनित, 3 ग्रे बार देखा गया हो, ताकि आप के साथ एक छोड़ दिया बारी बारी से करने को देखने के कारण है विभिन्न स्तर मध्य में हैं (दूसरी छवि)। आप देख सकते हैं कि इस बिंदु पर पहले से ही दृश्य की चौड़ाई काफी कम हो गई है। तीसरी छवि खेल के नाम वाले दृश्य पर क्लिक करने के बाद होती है, जिससे इसे बीच में घुमाया जाता है।

जो मैं कह सकता हूं उससे, दृश्य में चौड़ाई कम हो जाती है जब यह बीच में घूमती है। लेकिन मुझे नहीं पता कि क्यों।

यहां प्रासंगिक कोड है। pos बताता है कि प्रश्न में view कहां स्थित है। 0 इंगित करता है कि यह बीच में है, 1 इंगित करता है कि यह बीच के अधिकार के लिए एक है, -1, मध्य के बाईं ओर से एक है आदि

- (void)perspectiveView:(MenuSection *)view forPosition:(NSInteger)pos 
{ 

    CALayer *layer = view.layer; 
    CATransform3D transform = CATransform3DIdentity; 

    MenuSection *prevView = (pos >= 0) ? (MenuSection *)[self viewWithTag:view.tag - 1] : (MenuSection *)[self viewWithTag:view.tag + 1]; 

    if (pos == 0) { 
     view.changingToFrame = CGRectMake(round((480 - view.frame.size.width)/2), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
     view.frame = view.changingToFrame; 

    } else { 

     if (pos == 1) { 
      NSLog(@"%@",NSStringFromCGRect(prevView.changingToFrame)); 
      view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
      transform.m34 = 1.0/1000; 
     } else if (pos == -1){ 
      view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
      transform.m34 = 1.0/-1000; 
     } else if (pos == 2){ 
      view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
      transform.m34 = 1.0/500; 
     } else if (pos == -2){ 
      view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
      transform.m34 = 1.0/-500; 
     } 

     view.frame = view.changingToFrame; 

     transform = CATransform3DRotate(transform, 45.0f * M_PI/180.0f, 0.0f, 1.0f, 0.0f); 
    } 

    layer.transform = transform; 
} 
+0

मैंने ज़ेड अक्ष ट्रांसफॉर्म की थोड़ी सी मात्रा जोड़कर इसे हल किया। यह हमेशा काम नहीं करता है, और यदि गलत किया जाता है, तो y = x अक्ष के साथ आपका दृश्य गुना होगा। – CodaFi

+0

के लिए transform.m34 क्या है? मैंने इस तरह के विचारों को चौड़ाई के बिना कभी घुमाया है। सुनिश्चित नहीं है कि क्या हो रहा है ... – bentford

+0

मुझे इस पोस्ट से ट्रांसफॉर्म कोड मिला: http://stackoverflow.com/questions/347721/how-do-i-apply-a-perspective-transform-to-a-uiview। क्या आप विचारों को घुमाने के लिए एक कोड उदाहरण प्रदान कर सकते हैं? अगर मैं transform.m34 स्टेटमेंट को हटा देता हूं, तो मैं इस तरह दिखने वाले ट्रांसफॉर्म के साथ समाप्त होता हूं: http://cl.ly/2Z0v0P1U1T2a1p240x3L – maxedison

उत्तर

7

मैंने इसे हल कर लिया है। यह बताता है कि CATransform3D लागू करने से वास्तव में दृश्य के फ्रेम में परिवर्तन होता है। मैंने पोस्ट किए गए कोड में, जब मैंने दृश्य का नया फ्रेम सेट किया (क्योंकि यह एक अलग स्थिति में घूमता है), तो मैं चौड़ाई को बनाए रखने के प्रयास में CGRectMake() में view.frame.size.width का उपयोग करता हूं। लेकिन, चूंकि CATransform3D ने पहले चौड़ाई को संशोधित किया था, इसलिए मुझे वास्तविक चौड़ाई नहीं मिलती है।

समाधान UIViews को उपclass करना था और अपने मूल फ्रेम को ivar में स्टोर करना था। इस तरह, मैं अलग-अलग पदों पर विचारों को स्थानांतरित करते समय संदर्भ बिंदु के रूप में हमेशा इसका उपयोग कर सकता हूं।

+2

+1 आपने यह सुझाव देने के लिए समाधान –

+0

+1 लिखने का प्रयास करने के लिए प्रयास किया है। – Martin

0

आप CATransform3D मैट्रिक्स संपादित करने की जरूरत नहीं होनी चाहिए इस प्रभाव के लिए काम करने के लिए सीधे (m34, आदि ...)। इस प्रयास करें:

if (pos == 0) { 
    view.changingToFrame = CGRectMake(round((480 - view.frame.size.width)/2), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
    view.frame = view.changingToFrame; 
} else { 
    if (pos == 1) { 
     view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
     transform = CATransform3DRotate(transform, M_PI/4.0f, 0.0f, 1.0f, 0.0f); 
    } else if (pos == -1){ 
     view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
     transform = CATransform3DRotate(transform, -M_PI/4.0f, 0.0f, 1.0f, 0.0f); 
    } else if (pos == 2){ 
     view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
     transform = CATransform3DRotate(transform, M_PI/3.0f, 0.0f, 1.0f, 0.0f); 
    } else if (pos == -2){ 
     view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height); 
     transform = CATransform3DRotate(transform, -M_PI/3.0f, 0.0f, 1.0f, 0.0f); 
    } 
    view.frame = view.changingToFrame; 
} 
layer.transform = transform; 

और जब तक यह सही लग रहा है तो उन कोणों के साथ खेलते हैं।

+0

यदि आप परिप्रेक्ष्य चाहते हैं तो आपको सीधे 'm34' को संशोधित करना होगा। * [कोर एनीमेशन प्रोग्रामिंग गाइड] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html#//apple_ref/ में "ट्रांसफॉर्म डेटा संरचना को संशोधित करना" देखें डॉक/यूआईडी/TP40006082-SW14) *। –

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