2011-03-28 6 views
12

मैं एक पहेली गेम पर काम कर रहा हूं और मुझे पहेली के टुकड़े को प्रत्येक डबल टैप पर 90 डिग्री कोण पर घुमाने की आवश्यकता है।घुमाएं UIView iPhone

मैंने दो अलग-अलग तरीकों से उपयोग करने की कोशिश की है। पहली विधि इस एक है:

[UIView beginAnimations:@"rotate" context:nil]; 
[UIView setAnimationDuration:0.5]; 
self.transform = CGAffineTransformMakeRotation(90); 
[UIView commitAnimations]; 

कि कि कर रहे हैं टुकड़ा नहीं 90 डिग्री घूर्णन कर रहा है साथ ही समस्याओं; यह लगभग 100 डिग्री से घूर्णन कर रहा है, और यह एनीमेशन पहेली टुकड़ा UIView के फ्रेम को संशोधित कर रहा है।

frame BEFORE ROTATION: {{35, 178}, {80, 80}} 

frame AFTER ROTATION: {{21.3172, 164.317}, {107.366, 107.366}} 

दूसरी विधि मैंने कोशिश की यह एक था:

CABasicAnimation* spinAnimation = [CABasicAnimation 
             animationWithKeyPath:@"transform.rotation"]; 
spinAnimation.toValue = [NSNumber numberWithFloat:1]; 
[self.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 

इस विधि के साथ समस्या है कि रोटेशन खत्म करने के बाद, यह मेरी UIView विपरीत हो रहा है

यह मेरा सांत्वना उत्पादन होता है अपने पिछले राज्य में।

मैं इन समस्याओं के बिना पहेली टुकड़े को एनीमेशन के साथ कैसे घुमा सकता हूं?

उत्तर

48

प्रयास करें

[UIView beginAnimations:@"rotate" context:nil]; 
[UIView setAnimationDuration:0.5]; 
self.transform = CGAffineTransformMakeRotation(DegreesToRadians(90)); 
[UIView commitAnimations]; 

जहां

#define DegreesToRadians(x) ((x) * M_PI/180.0) 
+0

महान और सरल समाधान। – CroiOS

+0

यह वास्तव में मेरे लिए एनिमेट नहीं कर रहा है, यह सिर्फ दो रोटेशन राज्यों के बीच स्विच कर रहा है ... –

5

आपका पहला पद्धति के रूप में DegreesToRadians परिभाषित कर सकते हैं, अच्छा है exept कोण रेडियन

[UIView beginAnimations:@"rotate" context:nil]; 
[UIView setAnimationDuration:0.5]; 
self.transform = CGAffineTransformMakeRotation(90/180*M_PI); 
[UIView commitAnimations]; 
2

मैं इस का सबसे अच्छा तरीका है में है सी फंक्शन घोषित करने के लिए

static inline CGFloat degreesToRadians(CGFloat degrees) {return (degrees) * M_PI/180.0f;} 

और इस

[UIView beginAnimations:@"rotate" context:nil]; 
[UIView setAnimationDuration:0.5]; 
self.transform = CGAffineTransformMakeRotation(degreesToRadians(180.0f)); 
[UIView commitAnimations]; 
+0

बस स्पष्ट करने के लिए, एक परिभाषा तेज है तो एक सी फ़ंक्शन। उस MAX, MIN, ABS की वजह से भी परिभाषाएं हैं। –

4

अधिकांश किसी की तरह उपयोग यह अब आईओएस animating के लिए एनीमेशन ब्लॉकों का उपयोग कर रहा है। तो इस तरह की एक छोटी सी चीज है जो मैं अनुशंसा करता हूं (बेशक आप घूमने के लिए अपना समय और एनीमेशन विकल्प और डिग्री निर्धारित कर सकते हैं)। का आनंद लें

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     YOURVIEW.transform = CGAffineTransformMakeRotation(DegreesToRadians(180)); 
    } completion:^(BOOL finished) { 

    }]; 

#define DegreesToRadians(x) ((x) * M_PI/180.0) 

आप देख रहे हैं एक 360 डिग्री बारी है कि थोड़ा अधिक मुश्किल है, क्योंकि यह वास्तव में क्या किया जा रहा है खत्म हो जाएगा की एक रोटेशन चेतन नहीं चाहता है जहां यह बहुत कुछ इस तरह का उपयोग शुरू कर दिया है के लिए:

- (void)rotateSpinningView:(UIView *)viewToSpin{ 
    [UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ 
     [viewToSpin setTransform:CGAffineTransformRotate(viewToSpin.transform, M_PI_2)]; 
    } completion:^(BOOL finished) { 
     if (finished && !CGAffineTransformEqualToTransform(viewToSpin.transform, CGAffineTransformIdentity)) { 
      [self rotateSpinningView:viewToSpin]; 
     } 
    }]; 
}