2015-06-23 8 views
5

के साथ CGAffineTransformMakeRotation मैं एनीमेशन ब्लॉक के अंदर UIView घुमाने के लिए CGAffineTransformMakeRotation का उपयोग कर रहा हूं, और मैं इसे 180º के लिए घुमावदार घुमाने के लिए चाहता हूं।नकारात्मक एमएफआई

हालांकि जब मैं

myView.animateWithDuration(0.5) 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI)) 

डाल यह अभी भी दक्षिणावर्त घूमता है। क्या मुझे भ्रमित कर रहा है कि अगर मैं "मैन्युअल" M_PI का मूल्य बारे में, यह उम्मीद के रूप में

// this will rotate counterclockwise 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-3.14159265358979)) 

काम करता है क्यों इस व्यवहार?

संपादित करें: मैं एक एनीमेशन ब्लॉक

+0

मैं आपकी समस्या को उद्देश्य-सी या तेज़ में पुन: पेश नहीं कर सकता, हमेशा घड़ी की दिशा में घूमता है - -3.141592 द्वारा घूर्णन वांछित प्रभाव देता है। – luk2302

उत्तर

8

का उपयोग के रूप में मैं अपनी पहली टिप्पणी में और सेगी के रूप में कहा गया है पहले से ही लिखा है: एनीमेशन ले जाएगा इसकी कीमत कहां से कम है और जहां यह जाने की कोशिश कर रहा है, के बीच सबसे छोटी दूरी। सबसे अच्छा समाधान imho एक वामावर्त रोटेशन के लिए मजबूर कर के लिए CABasicAnimation उपयोग करने के लिए है:

let anim = CABasicAnimation(keyPath: "transform.rotation") 
anim.fromValue = M_PI 
anim.toValue = 0 
anim.additive = true 
anim.duration = 2.0 

myView.layer.addAnimation(anim, forKey: "rotate") 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI)) 

यह एक ही बार में 180 काउंटर दक्षिणावर्त द्वारा यह रोटेट किए जाएंगे।

आपके द्वारा अंतिम पंक्ति में निर्दिष्ट कोण + fromValue प्रारंभिक कोण -> 0. है और फिर घूर्णन (toValue - fromValue) = 0 - M_PI = - M_PI -> काउंटर घड़ी की दिशा 180 डिग्री रोटेशन दूरी पर जाएगा।

+0

यह किसी कारण से मेरे लिए काम नहीं करता है। भी मैं 'CGFloat.pi' का उपयोग कर रहा हूं क्योंकि यह स्विफ्ट 3.0 के साथ पसंदीदा है – NoSixties

5

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

अपेक्षित व्यवहार प्राप्त करने के लिए, आपको कम से कम दो एनिमेशन, को रोटेशन कोण को विभाजित करना होगा। उदाहरण

//first animation block 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation; 
//second animation block 
myView.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2))CGAffineTransformMakeRotation; 

स्विफ्ट के लिए 3,0

myView.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI/2)) 

या, और अधिक विश्वसनीय, CAKeyframeAnimation

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