2012-05-08 24 views
10

यह आसान होना चाहिए, लेकिन मुझे UIImageView को एक पूर्ण 360 डिग्री घूर्णन करने में परेशानी हो रही है, जो हमेशा के लिए दोहराया जाता है।घुमाएं UIImageView घड़ी की दिशा

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{ 
    self.reloadButton.imageView.transform = CGAffineTransformRotate(self.reloadButton.imageView.transform, -M_PI); 
} completion:^(BOOL finished) { 

}]; 

डॉक्स के अनुसार, कोण मैं CGAffineTransformRotate के पास की signedness रोटेशन की दिशा निर्धारित करता है, लेकिन इसके बाद के संस्करण कोड वामावर्त घूमता है। M_PI के साथ ही।

कोण, रेडियंस में कोण, जिसके द्वारा यह मैट्रिक्स समन्वय सिस्टम अक्ष को घुमाता है। आईओएस में, एक सकारात्मक मान काउंटरक्लॉक रोटेशन निर्दिष्ट करता है और ऋणात्मक मान दक्षिणावर्त रोटेशन निर्दिष्ट करता है। मैक ओएस एक्स में, एक सकारात्मक मान दक्षिणावर्त रोटेशन निर्दिष्ट करता है और नकारात्मक मान काउंटरक्लॉक रोटेशन निर्दिष्ट करता है।

+0

क्या होता है अगर आप एक CATransform3D साथ imageViews परत पर रोटेशन करते हैं? –

+0

क्या आपने अन्य कोणों से घूर्णन करने की कोशिश की (180 डिग्री कहें)? – giorashc

+0

सुझाव के लिए @ दाऊद धन्यवाद लेकिन इस उत्पादन एक ही परिणाम: self.reloadButton.imageView.layer.transform = CATransform3DMakeRotation (-M_PI, 0, 0, 1); – Morrowless

उत्तर

14

क्रिस्टोफ पहले से ही सही तरीके से जा रहा है, लेकिन एनीमेशन प्रतिनिधियों में इसे हर बार समाप्त होने के बिना इसे कताई रखने के लिए एक बेहतर तरीका है। यह बस गलत है।

बस अपनी एनीमेशन की दोहराव की संपत्ति HUGE_VALF पर सेट करें।

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = @0.0f; 
animation.toValue = @(2*M_PI); 
animation.duration = 0.5f;    // this might be too fast 
animation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"]; 

रूप in the documentation कहा गया है, इस एनीमेशन हमेशा के लिए दोहराने के लिए कारण होगा।

+1

ठीक है, वास्तव में इसके बारे में नहीं सोचा था, क्योंकि 270 डिग्री मेरे लिए पर्याप्त थे। दोहराना गिनती सेट करना बेहतर तरीका है, मैं तदनुसार बदल जाऊंगा। – Christoph

+1

कोड के लिए धन्यवाद! ग्रेट – eric

+0

काम करता है बस कुछ आयात करने के बजाय 'CGFLOAT_MAX' का उपयोग करें। –

1

क्षमा करें याद पहला भाग, दृश्य छोटे कोण का उपयोग कर ठीक घूमता है:

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     redView.transform = CGAffineTransformRotate(redView.transform, M_PI_2); 
    } completion:^(BOOL finished) { 

    }]; 

मैं किसी भी सार्थक स्पष्टीकरण क्यों यह M_PI के साथ विफल हो नहीं पा सके।

+0

दोहराना ठीक वही है जो मैं चाहता हूं, समस्या यह है कि यह घड़ी की दिशा में घूर्णन नहीं कर रहा है। – Morrowless

+0

मुझे लगता है कि इसकी वजह यह है कि घूर्णन की अंतिम स्थिति मूल स्थिति – giorashc

1

मुझे कुछ समय पहले एक ही समस्या का सामना करना पड़ा। मुझे लगता है कि इस मुद्दे के लिए कारण याद नहीं है, लेकिन यह मेरा समाधान है:

/** 
* Incrementally rotated the arrow view by a given angle. 
* 
* @param degrees Angle in degrees. 
* @param duration Duration of the rotation animation. 
*/ 
- (void)rotateArrowViewByAngle:(CGFloat)degrees 
        withDuration:(NSTimeInterval)duration { 

    CABasicAnimation *spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    spinAnimation.fromValue = [NSNumber numberWithFloat:self.currentAngle/180.0 * M_PI]; 
    spinAnimation.toValue = [NSNumber numberWithFloat:degrees/180.0 * M_PI]; 
    spinAnimation.duration = duration; 
    spinAnimation.cumulative = YES; 
    spinAnimation.additive = YES; 
    spinAnimation.removedOnCompletion = NO; 
    spinAnimation.delegate = self; 
    spinAnimation.fillMode = kCAFillModeForwards; 

    [self.arrowView.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 

    self.currentAngle = degrees; 
} 

और फिर आप यह घूर्णन रखने को घुमाने के लिए प्रतिनिधि तरीकों

- (void)animationDidStart:(CAAnimation *)theAnimation 
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 

उपयोग कर सकते हैं। इसके अलावा, डिग्री और अवधि पैरामीटर वास्तव में उच्च संख्या हो सकते हैं ... यदि यह पर्याप्त है।

अद्यतन:
रूप yinkou ने कहा,

spinAnimation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 

तरह से बेहतर है कि प्रतिनिधि में एनीमेशन को पुन: प्रारंभ।

कृपया ध्यान दें:
self.currentAngle एक संपत्ति वर्तमान अंतिम रोटेशन को याद है।
मुझे दृश्य की आवश्यकता है कि दृश्य को बाएं और दाएं रास्ते में घुमाएं।