物镜c-Iphone如何使图像连续旋转约60秒,然后停止在另一个方向



我需要图像旋转几次,然后在相反的方向上停止。这个图像是一个箭头指向右侧的按钮,然后旋转几次,面向另一个方向停止。任何帮助都将不胜感激。这就是我现在所拥有的。

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
  animation.duration = 0.60;//animation.duration = 0.60;
  animation.repeatCount = 1;//animation.repeatCount = 1000ˆ
//#warning remove comment brackets below
  animation.keyTimes = [NSArray arrayWithObjects:
                        [NSNumber numberWithFloat:0.0],
                        [NSNumber numberWithFloat:1.0], nil];
  animation.values = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0],
                      [NSNumber numberWithFloat:(degrees / 180)*M_PI], nil];
  animation.fillMode = kCAFillModeForwards;

请尝试并告诉我。这对我有用。

UIImageView *tempView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 80, 80)];
    tempView.image = [UIImage imageNamed:@"Icon"];
    tempView.backgroundColor = [UIColor redColor];
    [self.view addSubview:tempView];
    const NSUInteger rotations = 10;
    const NSTimeInterval duration  = 5;
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    CGFloat touchUpStartAngle = 0;
    CGFloat touchUpEndAngle = (M_PI);
    CGFloat angularVelocity = (((2 * M_PI) * rotations) + M_PI) / duration;
    anim.values = @[@(touchUpStartAngle), @(touchUpStartAngle + angularVelocity * duration)];
    anim.duration = duration;
    anim.autoreverses = NO;
    anim.delegate = self;
    anim.repeatCount = 1;
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [tempView.layer addAnimation:anim forKey:@"test"];
    tempView.transform = CGAffineTransformMakeRotation(touchUpStartAngle + (touchUpEndAngle));

以下代码对我有效。它实际上不会改变方向。我认为你可以通过添加一个改变图像阵列的计时器来实现这一点。首先,我也试着像你一样使用CAKeyframeAnimation,但我无法理解。所以我换了一个动画图像——我认为这种方式不会太糟糕,因为苹果也使用这种方式来动画活动指示器。

-(void) myImageInitFunction {
    UIImage *icon = [UIImage imageNamed:@"yourIconImage"];
    NSArray *imagesArray = rotatingImagesArrayOfImage(icon, 30);
    myImageViewThatShouldRotate.animationImages = imageArray;
    myImageViewThatShouldRotate.animationDuration= 2.0;
    [myImageViewThatShouldRotate startAnimating];
}
NSArray *rotatingImagesArrayOfImage(UIImage * icon, NSInteger nFrames)
{
    NSMutableArray *images = [NSMutableArray arrayWithObject:icon];
    for (NSInteger nLoop = 1; nLoop < nFrames; nLoop++) {
            [images addObject: [UIImage imageWithCGImage: CGImageRotatedByAngle(icon.CGImage, nLoop * ( 360 / nFrames)) ] ];
    }
    return images;
}
CGImageRef CGImageRotatedByAngle(CGImageRef imgRef,  CGFloat angle) {
    CGFloat angleInRadians = angle * (M_PI / 180);
    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);
    CGRect imgRect = CGRectMake(0, 0, width, height);
    CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bmContext = CGBitmapContextCreate(NULL,
                                               rotatedRect.size.width,
                                               rotatedRect.size.height,
                                               8,
                                               0,
                                               colorSpace,
                                               kCGImageAlphaPremultipliedFirst);
    CGContextSetAllowsAntialiasing(bmContext, YES);
    CGContextSetShouldAntialias(bmContext, YES);
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);
    CGColorSpaceRelease(colorSpace);
    CGContextTranslateCTM(bmContext,
                      +(rotatedRect.size.width/2),
                      +(rotatedRect.size.height/2));
    CGContextRotateCTM(bmContext, angleInRadians);
    CGContextTranslateCTM(bmContext,
                      -(rotatedRect.size.width/2),
                      -(rotatedRect.size.height/2));
    CGContextDrawImage(bmContext, CGRectMake(0, 0,
                                         rotatedRect.size.width,
                                         rotatedRect.size.height),
                   imgRef);

    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
    CFRelease(bmContext);
    return rotatedImage;
}

我使用这个:

- (void)startAnimations {
   CABasicAnimation* spinAnimation = [CABasicAnimation
                                   animationWithKeyPath:@"transform.rotation"];
   spinAnimation.toValue = [NSNumber numberWithFloat:M_PI];
   spinAnimation.cumulative = YES;
   spinAnimation.duration = 0.5;
   spinAnimation.repeatCount = 10000;
   [imageView.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
}
- (void)cancelAnimations {
   [imageView.layer removeAnimationForKey:@"spinAnimation"];
   imageView.transform = CGAffineTransformMakeRotation(0.0);
}

调用启动动画中的计时器以在60秒内调用取消动画。你可以使旋转角度,你想要

感谢大家,这个页面现在非常足智多谋。

这是另一个解决方案。

- (CAKeyframeAnimation *)rotateFrom:(CGFloat)fromDegrees to:(CGFloat)toDegrees {
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation.delegate = self;
    animation.duration = 0.30;
    animation.repeatCount = 1;

    animation.keyTimes = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.0],
                          [NSNumber numberWithFloat:1.0], nil];
    animation.values= [NSArray arrayWithObjects:
                       [NSNumber numberWithFloat:fromDegrees*(M_PI/180)],
                       [NSNumber numberWithFloat:toDegrees*(M_PI/180)], nil];
    animation.fillMode = kCAFillModeForwards;


    animation.removedOnCompletion = NO;

    return animation;

}

相关内容

最新更新