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开始之前重新设置为度数。
3 回答
有只小跳蛙
TA贡献1824条经验 获得超8个赞
找到一个方法(我修改了一下),对我来说非常有效:iphone UIImageView旋转
#import <QuartzCore/QuartzCore.h>- (void) runSpinAnimationOnView:(UIView*)view duration:(CGFloat)duration rotations:(CGFloat)rotations repeat:(float)repeat {
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 = repeat ? HUGE_VALF : 0;
[view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];}
慕娘9325324
TA贡献1783条经验 获得超5个赞
我发现他的代码并不是我所需要的。options我相信默认值是给你UIViewAnimationOptionCurveEaseInOut,在连续动画中看起来不正确。此外,我添加了一个检查,以便我可以在需要时(不是无限,但是无限期)在一个偶数四分之一圈停止我的动画,并使加速度在前90度加速,并在最后90度减速(在要求停止后):
// an ivar for your class:BOOL animating;- (void)spinWithOptions:(UIViewAnimationOptions)options {
// this spin completes 360 degrees every 2 seconds
[UIView animateWithDuration:0.5
delay:0
options:options
animations:^{
self.imageToMove.transform = CGAffineTransformRotate(imageToMove.transform, M_PI / 2);
}
completion:^(BOOL finished) {
if (finished) {
if (animating) {
// if flag still set, keep spinning with constant speed
[self spinWithOptions: UIViewAnimationOptionCurveLinear];
} else if (options != UIViewAnimationOptionCurveEaseOut) {
// one last spin, with deceleration
[self spinWithOptions: UIViewAnimationOptionCurveEaseOut];
}
}
}];}- (void)startSpin {
if (!animating) {
animating = YES;
[self spinWithOptions: UIViewAnimationOptionCurveEaseIn];
}}- (void)stopSpin {
// set the flag to stop spinning after one last 90 degree increment
animating = NO;}更新
我添加了处理再次开始旋转的请求的能力(startSpin),而之前的旋转正在逐渐减少(完成)。Github上的示例项目。
慕森卡
TA贡献1806条经验 获得超8个赞
在Swift中,您可以使用以下代码进行无限循环:
斯威夫特4
extension UIView {
private static let kRotationAnimationKey = "rotationanimationkey"
func rotate(duration: Double = 1) {
if layer.animation(forKey: UIView.kRotationAnimationKey) == nil {
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation.fromValue = 0.0
rotationAnimation.toValue = Float.pi * 2.0
rotationAnimation.duration = duration
rotationAnimation.repeatCount = Float.infinity
layer.add(rotationAnimation, forKey: UIView.kRotationAnimationKey)
}
}
func stopRotating() {
if layer.animation(forKey: UIView.kRotationAnimationKey) != nil {
layer.removeAnimation(forKey: UIView.kRotationAnimationKey)
}
}}斯威夫特3
let kRotationAnimationKey = "com.myapplication.rotationanimationkey" // Any keyfunc rotateView(view: UIView, duration: Double = 1) {
if view.layer.animationForKey(kRotationAnimationKey) == nil {
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation.fromValue = 0.0
rotationAnimation.toValue = Float(M_PI * 2.0)
rotationAnimation.duration = duration
rotationAnimation.repeatCount = Float.infinity
view.layer.addAnimation(rotationAnimation, forKey: kRotationAnimationKey)
}}停止就像:
func stopRotatingView(view: UIView) {
if view.layer.animationForKey(kRotationAnimationKey) != nil {
view.layer.removeAnimationForKey(kRotationAnimationKey)
}}- 3 回答
- 0 关注
- 942 浏览
添加回答
举报
0/150
提交
取消
