UIView无限360度旋转动画?

UIView无限360度旋转动画?

我正在尝试旋转UIImageView360度,并在线查看了几个教程。我可以让他们都没有工作,没有UIView停止,或跳到一个新的位置。

  • 我怎样才能做到这一点?

我尝试过的最新事情是:

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:0
                 animations:^{
                     imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Done!");
                 }];

但是如果我使用2 * pi,它根本不会移动(因为它是相同的位置)。如果我尝试做pi(180度),它可以工作,但如果我再次调用该方法,它会向后旋转。

编辑

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:0
                 animations:^{
                     [UIView setAnimationRepeatCount:HUGE_VALF];
                     [UIView setAnimationBeginsFromCurrentState:YES];
                     imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Done!");
                 }];

也不起作用。它会转到180度数,暂停一瞬间,然后在重新0开始之前重新设置为度数。


守着星空守着你
浏览 808回答 3
3回答

有只小跳蛙

找到一个方法(我修改了一下),对我来说非常有效:iphone UIImageView旋转#import&nbsp;<QuartzCore/QuartzCore.h>-&nbsp;(void)&nbsp;runSpinAnimationOnView:(UIView*)view&nbsp;duration:(CGFloat)duration&nbsp;rotations:(CGFloat)rotations&nbsp;repeat:(float)repeat&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;CABasicAnimation*&nbsp;rotationAnimation; &nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation&nbsp;=&nbsp;[CABasicAnimation&nbsp;animationWithKeyPath:@"transform.rotation.z"]; &nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.toValue&nbsp;=&nbsp;[NSNumber&nbsp;numberWithFloat:&nbsp;M_PI&nbsp;*&nbsp;2.0&nbsp;/*&nbsp;full&nbsp;rotation*/&nbsp;*&nbsp;rotations&nbsp;*&nbsp;duration&nbsp;]; &nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.duration&nbsp;=&nbsp;duration; &nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.cumulative&nbsp;=&nbsp;YES; &nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.repeatCount&nbsp;=&nbsp;repeat&nbsp;?&nbsp;HUGE_VALF&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;[view.layer&nbsp;addAnimation:rotationAnimation&nbsp;forKey:@"rotationAnimation"];}

慕娘9325324

我发现他的代码并不是我所需要的。options我相信默认值是给你UIViewAnimationOptionCurveEaseInOut,在连续动画中看起来不正确。此外,我添加了一个检查,以便我可以在需要时(不是无限,但是无限期)在一个偶数四分之一圈停止我的动画,并使加速度在前90度加速,并在最后90度减速(在要求停止后)://&nbsp;an&nbsp;ivar&nbsp;for&nbsp;your&nbsp;class:BOOL&nbsp;animating;-&nbsp;(void)spinWithOptions:(UIViewAnimationOptions)options&nbsp;{ &nbsp;&nbsp;&nbsp;//&nbsp;this&nbsp;spin&nbsp;completes&nbsp;360&nbsp;degrees&nbsp;every&nbsp;2&nbsp;seconds &nbsp;&nbsp;&nbsp;[UIView&nbsp;animateWithDuration:0.5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay:0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options:options &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animations:^{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.imageToMove.transform&nbsp;=&nbsp;CGAffineTransformRotate(imageToMove.transform,&nbsp;M_PI&nbsp;/&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completion:^(BOOL&nbsp;finished)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(finished)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(animating)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;if&nbsp;flag&nbsp;still&nbsp;set,&nbsp;keep&nbsp;spinning&nbsp;with&nbsp;constant&nbsp;speed &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;spinWithOptions:&nbsp;UIViewAnimationOptionCurveLinear]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(options&nbsp;!=&nbsp;UIViewAnimationOptionCurveEaseOut)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;one&nbsp;last&nbsp;spin,&nbsp;with&nbsp;deceleration &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;spinWithOptions:&nbsp;UIViewAnimationOptionCurveEaseOut]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}];}-&nbsp;(void)startSpin&nbsp;{ &nbsp;&nbsp;&nbsp;if&nbsp;(!animating)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animating&nbsp;=&nbsp;YES; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;spinWithOptions:&nbsp;UIViewAnimationOptionCurveEaseIn]; &nbsp;&nbsp;&nbsp;}}-&nbsp;(void)stopSpin&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;set&nbsp;the&nbsp;flag&nbsp;to&nbsp;stop&nbsp;spinning&nbsp;after&nbsp;one&nbsp;last&nbsp;90&nbsp;degree&nbsp;increment &nbsp;&nbsp;&nbsp;&nbsp;animating&nbsp;=&nbsp;NO;}更新我添加了处理再次开始旋转的请求的能力(startSpin),而之前的旋转正在逐渐减少(完成)。Github上的示例项目。

慕森卡

在Swift中,您可以使用以下代码进行无限循环:斯威夫特4extension&nbsp;UIView&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;let&nbsp;kRotationAnimationKey&nbsp;=&nbsp;"rotationanimationkey" &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;rotate(duration:&nbsp;Double&nbsp;=&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;layer.animation(forKey:&nbsp;UIView.kRotationAnimationKey)&nbsp;==&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;rotationAnimation&nbsp;=&nbsp;CABasicAnimation(keyPath:&nbsp;"transform.rotation") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.fromValue&nbsp;=&nbsp;0.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.toValue&nbsp;=&nbsp;Float.pi&nbsp;*&nbsp;2.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.duration&nbsp;=&nbsp;duration &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.repeatCount&nbsp;=&nbsp;Float.infinity &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.add(rotationAnimation,&nbsp;forKey:&nbsp;UIView.kRotationAnimationKey) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;stopRotating()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;layer.animation(forKey:&nbsp;UIView.kRotationAnimationKey)&nbsp;!=&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.removeAnimation(forKey:&nbsp;UIView.kRotationAnimationKey) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}斯威夫特3let&nbsp;kRotationAnimationKey&nbsp;=&nbsp;"com.myapplication.rotationanimationkey"&nbsp;//&nbsp;Any&nbsp;keyfunc&nbsp;rotateView(view:&nbsp;UIView,&nbsp;duration:&nbsp;Double&nbsp;=&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;view.layer.animationForKey(kRotationAnimationKey)&nbsp;==&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;rotationAnimation&nbsp;=&nbsp;CABasicAnimation(keyPath:&nbsp;"transform.rotation") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.fromValue&nbsp;=&nbsp;0.0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.toValue&nbsp;=&nbsp;Float(M_PI&nbsp;*&nbsp;2.0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.duration&nbsp;=&nbsp;duration &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotationAnimation.repeatCount&nbsp;=&nbsp;Float.infinity &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.layer.addAnimation(rotationAnimation,&nbsp;forKey:&nbsp;kRotationAnimationKey) &nbsp;&nbsp;&nbsp;&nbsp;}}停止就像:func&nbsp;stopRotatingView(view:&nbsp;UIView)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;view.layer.animationForKey(kRotationAnimationKey)&nbsp;!=&nbsp;nil&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.layer.removeAnimationForKey(kRotationAnimationKey) &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP