2012-05-07 63 views
2

我试图重复一个动画序列,在LOOP内部,随机地在每个循环中改变一些参数。这是代码。任何人都知道为什么它不起作用? 如果我使用按钮动作调用它,它可以工作,但是使用循环它不会。 非常感谢! Giuseppe循环动画 - 不走

-(IBAction)startLoop:(id)sender { 
    for (int i=1;i<10; i++) { 
     [self animation2]; 
    } 
} 


-(id) animation2 { 

    int max=500; 
    UIImage *myImage = [UIImage imageNamed:@"coccinella2.png"]; 
    CALayer *myLayer = [CALayer layer]; 
    myLayer.contents = (id)myImage.CGImage; 
    myLayer.bounds = CGRectMake(0, 0, 50, 60); 
    [myLayer setPosition:CGPointMake(arc4random()%(max), arc4random()%(max))]; 
    [myLayer setBounds:CGRectMake(0.0, 0.0, 50.0, 60.0)]; 
    [self.view.layer addSublayer:myLayer]; 


    //translation1 
    CGPoint startPt = CGPointMake(arc4random()%(max),arc4random()%(max)); 
    CGPoint endPt = CGPointMake(arc4random()%(max),arc4random()%(max)); 
    CABasicAnimation *transl1 = [CABasicAnimation animationWithKeyPath:@"position"]; 
    transl1.removedOnCompletion = FALSE; 
    transl1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    transl1.fromValue = [NSValue valueWithCGPoint:startPt]; 
    transl1.toValue = [NSValue valueWithCGPoint:endPt]; 
    transl1.duration = 2.0; 
    transl1.fillMode = kCAFillModeForwards; 
    transl1.beginTime = 0; 

    //scale 1 
    CABasicAnimation *scale1 = [CABasicAnimation 
           animationWithKeyPath:@"transform.scale"]; 
    scale1.removedOnCompletion = FALSE; 
    [scale1 setToValue:[NSNumber numberWithInt:3]]; 
    [scale1 setDuration:2.0f]; 
    scale1.fillMode = kCAFillModeForwards; 
    scale1.beginTime = 0; 

    //rotation1 
    CABasicAnimation *rotation1 = [CABasicAnimation 
            animationWithKeyPath:@"transform.rotation.z"]; 
    rotation1.removedOnCompletion = FALSE; 
    [rotation1 setFromValue:DegreesToNumber(0)]; 
    [rotation1 setToValue:DegreesToNumber(90)]; 
    //rotation1.repeatCount = HUGE_VALF; 
    [rotation1 setDuration:2.0f]; 
    rotation1.fillMode = kCAFillModeForwards; 
    rotation1.beginTime = 0; 

    //group 
    CAAnimationGroup* group = [CAAnimationGroup animation]; 
    [group setDuration: 6.0]; 
    group.removedOnCompletion = FALSE; 
    group.fillMode = kCAFillModeForwards; 
    [group setAnimations: [NSArray arrayWithObjects:scale1, transl1, rotation1, nil]]; 
    [myLayer addAnimation: group forKey: nil]; 
} 

回答

2

您的代码不会重复注释10次,但会立即启动10个动画。如果您的目标是在前一个结束后开始动画,则应尝试使用NSTimer

+0

谢谢,我的目标是不断重复动画,例如每0.1秒,我怎么能调用这个方法? – Beppino66

1

您可以使用一个NSTimer在不同的时间来触发各组动画,也可以设置BEGINTIME对每个组,使用如下代码:

group.beginTime = CACurrentMediaTime() + delay; 

对于动画,使用BEGINTIME提供了更多的准确的时间,因为CA在单独的线程上运行,并且不会像NSTimers那样失速,如果您的应用程序忙碌。

+0

谢谢你,我的目标是不断重复动画,例如每0.1秒,我怎样才能调用“animation2”方法? – Beppino66

+0

如果您想要重复动画,请勿使用for循环并创建多个动画。在组动画上设置repeatCount属性,系统将在一个简单的步骤中为您完成。你是否想要每一步都拿起另一个中断的地方?如果是这样,您需要将removedOnCompletion属性设置为false,并将fillMode设置为kCAFillModeForwards。 (为所有个人动画做最后2件事情,并为个人动画和组设置removedOnCompletion。) –