2012-05-04 17 views
10
[CATransaction begin]; 
      [CATransaction setAnimationDuration:5]; 
      CGAffineTransform currentTransform = squareLayer.affineTransform; 
      CGFloat angle = M_PI; 

      squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle); 
      [CATransaction commit]; 

औरजब मैं क्लॉक वार जाना चाहता हूं तो मेरा रोटेशन केवल विरोधी घड़ी क्यों जाता है?

[CATransaction begin]; 
      [CATransaction setAnimationDuration:5]; 
      CGAffineTransform currentTransform = squareLayer.affineTransform; 
      CGFloat angle = (M_PI * -1); 

      squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle); 
      [CATransaction commit]; 

मैं सोचा होगा -1 दिशा उलट है | लेकिन जाहिरा तौर पर नहीं?

उत्तर

12

कोण समान है। पूर्ण सर्कल जाने के लिए आपको 2 * पीआई की आवश्यकता है, इसलिए आधा सर्कल पीआई है। यदि आप लेते हैं -पीआई यह एक ही बिंदु पर समाप्त होगा।

संपादित करें: यदि आपको इसे घड़ी की दिशा में बदलना है तो आप थोड़ा दूर जा सकते हैं -पीआई। उदाहरण के लिए -एम_PI उपयोग -3.1415 9 3 के बजाय।

+0

मैं सहमत हूं लेकिन मुझे 180 घड़ी की दिशा में घुमाने की आवश्यकता है। इसे सक्रिय करने का सबसे अच्छा तरीका क्या है? चीयर्स – geminiCoder

+1

अच्छा, यह सबसे छोटी दिशा में घुमाएगा।यदि परिशुद्धता एक बड़ी समस्या नहीं है तो आप 180 डिग्री से नीचे या उससे नीचे घूम सकते हैं। यह एक त्वरित और गंदा फिक्स है लेकिन शायद काम करेगा। – RadicalRaid

+0

बस अपना संपादन देखा। यह अच्छी तरह से काम करता है लेकिन थोड़ा अपूर्ण लगता है। – geminiCoder

2

यहां सेब प्रलेखन से उद्धरण दिया गया है "आईओएस में, एक सकारात्मक मान काउंटरक्लॉक रोटेशन निर्दिष्ट करता है और ऋणात्मक मान दक्षिणावर्त रोटेशन निर्दिष्ट करता है।" यदि आप ऐसा करने की कोशिश की है:

squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, -M_PI); 

Thats क्या मैं अतीत में मेरे सभी दक्षिणावर्त रोटेशन करने के लिए इस्तेमाल किया है।

+0

हां यह समस्या है। जैसा कि आप उपरोक्त मेरे कोड में देख सकते हैं यह काम नहीं कर रहा है। पता नहीं क्यों? – geminiCoder

3

कोर एनिमेटिनॉन के साथ मेरा अनुभव उस ऐप्पल उद्धरण से सहमत नहीं है। जो मैंने पाया है वह केवल एक चीज है जो अंतिम कोण मान है। सकारात्मक पीआई और नकारात्मक पीआई रोटेशन के परिणामस्वरूप एक ही रूपांतरण मैट्रिक्स होता है, इसलिए सिस्टम परवाह किए बिना काउंटर-घड़ीवाइज चला जाता है।

मैंने एक विशिष्ट दिशा में घूर्णन या पूर्ण 360 डिग्री के घूर्णन में जाने के लिए क्या किया है, एक प्रकार का उपयोग करके एक स्पष्ट CABasicAnimation बनाना है जैसे fill.rotation.z, भरने मोड के साथ kCAFillModeForwards पर सेट करें, और केवल एक value प्रदान करते हैं। इससे एनीमेशन पिछले मान से शुरू होता है। फिर आप एक रोटेशन सेट कर सकते हैं जो आपके कुल वांछित रोटेशन का एक अंश भी है, और इसे दोहराना गिनती दें।

उदाहरण के लिए, नीचे दिया गया कोड एक एनीमेशन बनाता है जो 5 चौथाई मोड़ या 450 डिग्री घुमाता है। आप 180 डिग्री दक्षिणावर्त करना चाहता था, तो आप 2. की पुनरावृत्ति गिनती वामावर्त के लिए साथ pi/2 के एक रोटेशन, -pi/2 की 2.

CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath: 
    @"transform.rotation.z"]; 
    rotate.removedOnCompletion = FALSE; 
    rotate.fillMode = kCAFillModeForwards; 

    //Do a series of 5 quarter turns for a total of a 1.25 turns 
    //(2PI is a full turn, so pi/2 is a quarter turn) 
    [rotate setToValue: [NSNumber numberWithFloat: -M_PI/2]]; 
    rotate.repeatCount = 5; 

    rotate.duration = duration/rotate.repeatCount * 2 ; 
    rotate.beginTime = start; 
    rotate.cumulative = TRUE; 
    rotate.timingFunction = [CAMediaTimingFunction 
    functionWithName:kCAMediaTimingFunctionLinear]; 
7

बस इस में भाग पुनरावृत्ति गिनती के साथ इस्तेमाल कर सकते हैं और जबकि @ radicalraid का समाधान ठीक काम करता है, वांछित अंत बिंदु से कम कोण पर घूर्णन बनाम घूर्णन बनाम से पहले प्रारंभिक कोण को समायोजित करना पसंद करते हैं। इसके अलावा, आप एनीमेशन ब्लॉक का उपयोग करके CALayer रूपांतरणों को एनिमेट कर सकते हैं।

मेरे कोड:

// iOS will rotate the shortest distance to the end angle, 
// using counter-clockwise if equal. 
// Force the rotation to open clockwise and close counter-clockwise by bumping 
// the initial angle 
CGFloat startRadians, endRadians; 
if (isOpening) { 
    startRadians = 0.01f; 
    endRadians = M_PI; 

} 
else { 
    startRadians = M_PI - 0.01f; 
    endRadians = 0.0f; 
} 

self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(startRadians); 

[UIView animateWithDuration:0.3f 
       animations:^{ 
        self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(endRadians); 
       }]; 
0

डंकन और XJones साथ सहमत हूँ। अंतिम मूल्य यह सब कुछ लगता है। सीए को सबसे छोटा रास्ता मिल जाएगा।

XJones के विचार का उपयोग करना। विपरीत दिशा के लिए साइन - -M_PI उपयोग करने के बजाय -3 M_PI, वामावर्त

और हटाने के लिए * '': यह मेरे लिए काम करने के लिए लग रहा था:

private let angleRadians = CGFloat(M_PI) 
private let angleRadiansOffset = CGFloat(0.1 * M_PI/180.0) 

let turnAngle = angleRadians - angleRadiansOffset; 

//pre-rotate by an 'invisible amount', to force rotation in the same direction every time 
primView.layer.transform = CATransform3DRotate(primView.layer.transform, angleRadiansOffset, 0.0, 1.0, 0.0) 

UIView.animateKeyframesWithDuration(duration, delay: 0, options: [.BeginFromCurrentState], animations: {() -> Void in 

    UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.8, animations: {() -> Void in 

     //now we will complete the rotation to the correct end value 
     primView.layer.transform = CATransform3DRotate(primView.layer.transform, turnAngle, 0.0, 1.0, 0.0) 

    }) 

    //... other code .... 

}) { (finished) -> Void in 

} 
1

संपादित करें।

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

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