2009-02-12 12 views
28

मैं एक आईफोन ऐप लिख रहा हूं, और मुझे एक ऐसी छवि मिली है जिसे मैं बाहर घूमना चाहता हूं।क्या मैं 360 डिग्री से अधिक दृश्य को घुमाने के लिए CGAffineTransformMakeRotation का उपयोग कर सकता हूं?

वर्तमान में मेरे कोड इस तरह दिखता है (एक beginAnimations/commitAnimations ब्लॉक में लिपटे):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f); 
swirl = CGAffineTransformRotate(scale, M_PI); 
[player setTransform:swirl];  
[player setAlpha:0.0f]; 

लेकिन मुझे लगता है कि अगर मैं, करने के लिए, कहते हैं रोटेशन के कोण बदलने के लिए 4 * M_PI कोशिश है, यह बिल्कुल घूमता नहीं है। क्या CGAffineTransformRotate का उपयोग करके 720˚ रोटेशन प्राप्त करना संभव है, या क्या मुझे दूसरी तकनीक पर स्विच करना है?

अगर मुझे किसी अन्य तकनीक पर स्विच करना है, तो क्या आप एनीमेशन स्वयं करने के लिए एक और थ्रेड (या टाइमर) का उपयोग करने की सलाह देंगे, या ओपनजीएल जाने के लिए एक बेहतर मार्ग होगा?

धन्यवाद,
ब्लेक।

उत्तर

64

आप रोटेशन को टुकड़ों में विभाजित किए बिना, पूर्ण रोटेशन या पूर्ण घूर्णन के कई गुणों से कम, चाहे वह किसी भी रेडियंस द्वारा दृश्य को घुमा सकते हैं। एक उदाहरण के रूप में, निम्नलिखित कोड एक सेकंड प्रति सेकंड, एक निर्दिष्ट संख्या के लिए एक दृश्य स्पिन करेगा। आप घूर्णन की एक निश्चित संख्या, या कुछ रेडियंस द्वारा दृश्य को स्पिन करने के लिए इसे आसानी से संशोधित कर सकते हैं।

- (void) runSpinAnimationWithDuration:(CGFloat) duration; 
{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

    [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 
+0

यह काम करता है। इसे पोस्ट करने के लिए धन्यवाद और अन्य लोगों की पोस्ट पर टिप्पणी करते समय जोर देने के लिए धन्यवाद! मैं अपनी एनीमेशन विभाजित करने वाला था! – Dimitris

+0

मैं उन्हें भी विभाजित करता था और यह सही नहीं लग रहा था। – mahboudz

+0

सुनिश्चित करें कि आप transform.rotation.z के लिए ऐसा करते हैं, मुझे CATransform3DMakeRotation के साथ इसे बदलने के लिए बस इसे करने का प्रयास करने में समस्याएं थीं। जब मैंने रोटेशन फ़ंक्शन का उपयोग किया तो मैं "जिम्बल लॉक" में दौड़ रहा था। जब मैं ऊपर बताए अनुसार transform.rotation.z का उपयोग करता हूं तो यह खूबसूरती से काम करता है! – Jay

5

आप कर सकते हैं, लेकिन आपको अपनी एनीमेशन को अर्ध-सर्कल रोटेशन में विभाजित करने की आवश्यकता होगी। मैं दृश्य के नीचे परत पर लागू दोहराए गए CABasicAnimation का उपयोग करके, this question के जवाब में इसका एक उदाहरण प्रदान करता हूं। जैसा कि मैंने सुझाव दिया है, इन अर्ध-रोटेशन को कैकेफ्रेम एनीमेशन के कुछ हिस्सों के रूप में करना संभवतः यह संरचना करने का बेहतर तरीका होगा, क्योंकि एनीमेशन चिकना होगा (मेरे उदाहरण में आधे घूर्णन के बीच थोड़ा सा झटका है), और आप कर सकते हैं शुरुआत और अंत में एक अच्छा त्वरण/मंदी।

+0

कूल। ऐसा लगता है कि मैं क्या उम्मीद कर रहा था, और मुझे लगता है कि मैं इसमें स्केलिंग ट्रांसफॉर्म भी जोड़ सकता हूं, और अपनी कक्षा में अपनी सूचना वापस ले सकता हूं। धन्यवाद! – bwinton

+2

यह कहना गलत है कि आपको एनीमेशन को अर्ध-सर्कल रोटेशन में विभाजित करना है। मेरा जवाब देखें – mahboudz

+0

आप करते हैं, अगर आप CATransform3D पर उस मान के रूप में भरोसा करते हैं जो आप एनिमेट कर रहे हैं। मैंने कुंजीपैथ एक्सटेंशन का उपयोग करके आपके दृष्टिकोण के बारे में सोचा नहीं था कि कोर एनीमेशन ट्रांसफॉर्मेशन स्ट्रक्चर फ़ील्ड के लिए प्रदान करता है। आप सही हैं, शायद यह इस तक पहुंचने का एक साफ तरीका है। –

5

शीर्षक का उत्तर: हां, CGAffineTransform 360 डिग्री से अधिक ठीक घुमा सकता है।
प्रश्न का उत्तर: हाँ, लेकिन आप इसे एनिमेट नहीं कर सकते क्योंकि एनिमेट करने के लिए कुछ भी नहीं है।

कि the affine transformation is a matrix याद रखें, और एक रोटेशन मैट्रिक्स ज्या और कोज्या संख्या precomputed मौजूद है। जैसे कि आप ने कहा कि यह बताया गया है:

CGFloat angle = 4.0 * M_PI; 
NSAffineTransformStruct matrix = { 
    .m11 = cos(angle), 
    .m12 = sin(angle), 
    .m21 = -sin(angle), 
    .m22 = cos(angle), 
    .tx = 0.0, 
    .ty = 0.0 
}; 
NSAffineTransform *transform = [NSAffineTransform transform]; 
[transform setTransformStruct:matrix]; 

अब, चलो cos और sin के लिए कुछ नमूना मूल्यों की समीक्षा करें:

  • cos(0π) = 1
  • sin(0π) = 0
  • cos(2π) = 1
  • sin(2π) = 0
  • cos(4π) = 1
  • sin(4π) = 0

याद रखें, मैट्रिक्स कोण शामिल नहीं है - यह केवल कोज्या और साइन शामिल हैं। और वे मान एक सर्कल के एक से दूसरे में बदल नहीं जाते हैं। इसलिए, एनिमेट करने के लिए कुछ भी नहीं है।

(ध्यान दें कि Calculator.app cos (xπ) और पाप (xπ) के लिए गलत परिणाम देता है। फोटोग्राफर, calc, या Google की कोशिश करें।)

आप एक वृत्त के भागों में एनीमेशन विभाजित करने के लिए की आवश्यकता होगी। आधा सर्किल ब्रैड लार्सन ने सुझाव दिया कि ठीक है।

+2

आपको एनीमेशन को विभाजित करने की आवश्यकता नहीं है। मेरा जवाब देखें – mahboudz