2012-05-07 1 views
2

Я пытаюсь повторить последовательность анимаций внутри LOOP, изменяя в каждом цикле некоторые параметры случайным образом. Вот код. Кто-нибудь, пожалуйста, знает, почему он не работает? Если я назову его один раз с помощью действия кнопки, он работает, но с циклом это не так. Спасибо большое! GiuseppeLoop animation - не идет

-(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 вещи для всех отдельных анимаций и установите removeOnCompletion как для отдельных анимаций, так и для группы). –