0

我正在使用以下代码为圆圈设置动画。但是,它一直在闪烁。我想将动画的重启延迟 5 秒。我怎样才能做到这一点?

-(void)start
{    
    [self removeExistingAnimation];
    
    //create the image
    UIImage* img = [UIImage imageNamed:@"redCircle.png"];
    imageView = [[UIImageView alloc] initWithImage:img];
    imageView.frame = CGRectMake(0, 0, 0, 0);
    [self addSubview:imageView];
    
    //opacity animation setup
    CABasicAnimation *opacityAnimation;
    
    opacityAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
    opacityAnimation.duration = ANIMATION_DURATION;
    opacityAnimation.repeatCount = ANIMATION_REPEAT;
    //theAnimation.autoreverses=YES;
    opacityAnimation.fromValue = [NSNumber numberWithFloat:0.6];
    opacityAnimation.toValue = [NSNumber numberWithFloat:0.025];
    //resize animation setup
    CABasicAnimation *transformAnimation;
    
    transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    
    transformAnimation.duration = ANIMATION_DURATION;
    transformAnimation.repeatCount = ANIMATION_REPEAT;
    //transformAnimation.autoreverses=YES;
    transformAnimation.fromValue = [NSNumber numberWithFloat:MIN_RATIO];
    transformAnimation.toValue = [NSNumber numberWithFloat:MAX_RATIO];
    
    //group the two animation
    CAAnimationGroup *group = [CAAnimationGroup animation];
    
    group.repeatCount = ANIMATION_REPEAT;
    [group setAnimations:[NSArray arrayWithObjects:opacityAnimation, transformAnimation, nil]];
    group.duration = ANIMATION_DURATION;

    //apply the grouped animaton
    [imageView.layer addAnimation:group forKey:@"groupAnimation"];
}
4

2 回答 2

2

像这样做 :

-(void)start
{    
    [self removeExistingAnimation];

    //create the image
    UIImage* img = [UIImage imageNamed:@"redCircle.png"];
    imageView = [[UIImageView alloc] initWithImage:img];
    imageView.frame = CGRectMake(0, 0, 0, 0);
    [self addSubview:imageView];

    [self doAnimation];

    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(doAnimation) userInfo:nil repeats:YES];
}

-(void)doAnimation
{

//opacity animation setup
    CABasicAnimation *opacityAnimation;

    opacityAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
    opacityAnimation.duration = ANIMATION_DURATION;
    opacityAnimation.repeatCount = ANIMATION_REPEAT;
    //theAnimation.autoreverses=YES;
    opacityAnimation.fromValue = [NSNumber numberWithFloat:0.6];
    opacityAnimation.toValue = [NSNumber numberWithFloat:0.025];
    //resize animation setup
    CABasicAnimation *transformAnimation;

    transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];

    transformAnimation.duration = ANIMATION_DURATION;
    transformAnimation.repeatCount = ANIMATION_REPEAT;
    //transformAnimation.autoreverses=YES;
    transformAnimation.fromValue = [NSNumber numberWithFloat:MIN_RATIO];
    transformAnimation.toValue = [NSNumber numberWithFloat:MAX_RATIO];

    //group the two animation
    CAAnimationGroup *group = [CAAnimationGroup animation];

    group.repeatCount = ANIMATION_REPEAT;
    [group setAnimations:[NSArray arrayWithObjects:opacityAnimation, transformAnimation, nil]];
    group.duration = ANIMATION_DURATION;

    //apply the grouped animaton
    [imageView.layer addAnimation:group forKey:@"groupAnimation"];

}

这看起来像肮脏的方法,但对我有用,希望对你有帮助..

于 2013-02-18T15:27:28.660 回答
0

这不是更干净一点吗?或者有什么理由不能使用块来制作动画?

    - (void) start {
        //create the image
        UIImage* img = [UIImage imageNamed:@"redCircle.png"];
        imageView = [[UIImageView alloc] initWithImage:img];
        [self addSubview:imageView];

        [self animateWithDelay:0.0];
    }

    - (void) animateWithDelay:(CGFloat)delay {

        imageView.alpha = 0.0;
        imageView.transfrom = CGAffineTransformScale(myImage.transform, MIN_RATIO, MIN_RATIO);
        [UIImageView animateWithDuration:ANIMATION_DURATION delay:delay options:0 animations:^{

            imageView.alpha = 1.0;
            imageView.transfrom = CGAffineTransformScale(myImage.transform, MAX_RATIO, MAX_RATIO);

        } completion:^{
            animationCount++;
            if (ANIMATION_REPEAT != animationCount) {
                [self animateWithDelay:5.0];
            }
        }]; 

    }

你应该在你的类的某个地方定义 animationCount,这样你就知道他什么时候应该停止重复。

(未经测试,因此可能包含一些错误)

于 2013-02-18T16:02:04.363 回答