2012-10-10 86 views
5

我正在将指针指向12点到当前时间。如果是11点,我想让手臂顺时针旋转到11点钟的位置。但当然,如果我使用:顺时针旋转UIView以获得大于180度的角度

CGAffineTransform rotation = CGAffineTransformMakeRotation(2*M_PI*11/12); 

[UIView animateWithDuration:3.0 
        animations:^{ 
         clockArm.transform = rotation; 
        }]; 

旋转逆时针旋转。我想:

CGFloat angle = 2*M_PI*11/12; 
CGAffineTransform firstRotation = CGAffineTransformMakeRotation(M_PI-0.001); 
CGFloat firstRotationTime = 3.0*(M_PI/angle); 
CGAffineTransform secondRotation = CGAffineTransformMakeRotation(angle); 
CGFloat secondRotationTime = 3.0 - firstRotationTime; 

[UIView animateWithDuration:firstRotationTime 
         delay:0.0 
        options:UIViewAnimationCurveLinear 
       animations:^{ 
         self.clockArm1.transform = firstRotation; 
        } 
       completion:^(BOOL finished) { 
        [UIView animateWithDuration:secondRotationTime 
              delay:0.0 
             options:UIViewAnimationCurveLinear 
             animations:^{ 
              self.clockArm1.transform = secondRotation; 
             } 
             completion:^(BOOL finished){ 
             }]; 
       }]; 

动画并顺时针走,却是波涛汹涌 - 动画仍然似乎是在做一个UIViewAnimationEaseInOut第一个动画。我做错了什么,还是有另一种方法来实现我想要的?

+0

看一看http://stackoverflow.com/questions/9844925/uiview-infinite的接受的答案-360度旋转的动画。这有帮助吗? –

回答

5

您可以使用CATransaction完成块设置视图的旋转特性,当动画结束。下面的函数在我的测试情况下工作:

- (void) rotateViewAnimated:(UIView*)view 
       withDuration:(CFTimeInterval)duration 
        byAngle:(CGFloat)angle 
{ 
    [CATransaction begin]; 
    CABasicAnimation *rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.byValue = [NSNumber numberWithFloat:angle]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.removedOnCompletion = YES; 

    [CATransaction setCompletionBlock:^{ 
     view.transform = CGAffineTransformRotate(view.transform, angle); 
    }]; 

    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
    [CATransaction commit]; 
} 

您可以使用它像

[self rotateViewAnimated:self.clockArm1 withDuration:3.0 byAngle:2*M_PI*11./12.]; 
+0

这似乎工作,谢谢! – Darren

1

正如在评论中提到,试试这个iphone UIImageView rotationUIView Infinite 360 degree rotation animation?

#import <QuartzCore/QuartzCore.h> 

- (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

谢谢,那是为动画制作的,但由于某些原因动画完成后,我的时钟返回到12点钟的位置。我试过看CABasicAnimation,CAPropertyAnimation和CAAnimation上的文档。我尝试将removedOnCompletion属性设置为NO,但我一直无法弄清楚如何让转换持续下去。 – Darren

3

感谢@马丁 - [R的接受的答案。我编辑位:

我取代这一行

rotationAnimation.removedOnCompletion = YES; 

与以下两行:

rotationAnimation.removedOnCompletion = NO; 
rotationAnimation.fillMode = kCAFillModeForwards; 

然后,在CompletionBlock,我增加了一个行:

[view.layer removeAllAnimations]; 

所以,代码最后变成:

- (void) rotateViewAnimated:(UIView*)view 
      withDuration:(CFTimeInterval)duration 
       byAngle:(CGFloat)angle 
    { 
     [CATransaction begin]; 
     CABasicAnimation *rotationAnimation; 
     rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
     rotationAnimation.byValue = [NSNumber numberWithFloat:angle]; 
     rotationAnimation.duration = duration; 
     // changed by me 
     rotationAnimation.removedOnCompletion = NO; 
     rotationAnimation.fillMode = kCAFillModeForwards; 


     [CATransaction setCompletionBlock:^{ 
     view.transform = CGAffineTransformRotate(view.transform, angle); 
     // added by me 
     [view.layer removeAllAnimations]; // this is important 

     }]; 

    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
    [CATransaction commit]; 

    } 

我引用来自:

1,https://stackoverflow.com/a/3586433/2481444

2,After rotating a CALayer using CABasicAnimation the layer jumps back to it's unrotated position