2012-05-07 102 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。) –