2011-08-10 14 views
5

Sé que usted puede realizar una animataion de dos etapas usando bloques de este modo:animación utilizando bloques de varias etapas

[UIView animateWithDuration:25.0 delay:0.0 options:UIViewAnimationCurveLinear animations: 
    ^{ 
     aView.alpha = 2.5;   
    } 
     completion:^(BOOL finished) 
    { 
     aView.hidden = YES; 
    } 
]; 

..pero ¿cómo iba a crear una de varias etapas (más de 2) animación usando bloques?

+1

animación multietapa es realmente una característica de diseño que falta de la UIKit. Puedes obtener algo usando QuartzCore, pero no mucho. Alguien debería encontrar una mejor solución en el futuro. –

Respuesta

11

Use animaciones anidadas:

[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        //first animation 
       } 
       completion:^(BOOL finished){[UIView animateWithDuration:0.5 
                    delay:0.0 
                   options:UIViewAnimationOptionBeginFromCurrentState 
                   animations:^{ 
                    //second animation 
                   } 
                   completion:^(BOOL finished){//and so on.. 
                   }];}]; 
+0

Según doc de Apple, un bloque de animación anidada debe estar en el primer bloque de la animación en sí, no en el controlador de finalización. Sin embargo, es solo un tema de nombres. https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6-SW11 – ratsimihah

+0

En realidad, Apple también dice que este es el Cómo hacerlo: 'Usar un controlador de finalización es la forma principal de vincular múltiples animaciones. Han ilustrado en ** Listado 4-2 ** en su documentación. Si coloca el bloque anidado en el primer bloque, esencialmente comenzará simultáneamente con el primer bloque, en lugar de cuando las animaciones del primer bloque hayan finalizado. – tipycalFlow

+0

Absolutamente. No estaba contradiciendo este punto, solo señalando un problema de nomenclatura. El uso de un "controlador de finalización" y un "bloque anidado" son dos técnicas diferentes, y usted dijo "use bloques anidados" al mostrar un bloque de controlador de finalización. No es un gran trato. – ratsimihah

8

o se puede hacer una, de varias etapas método de animación recursiva:

-(void) multiStageAnimate{ 
[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        //animation code 
       } 
       completion:^(BOOL finished){ 
        if(/* If terminating condition not met*/) 
         [self multiStageAnimate]; 
       }]; 
} 
0

Comprendo que esto es una cuestión mayor, pero pensé que me gustaría añadir mi entrada.

creé una clase para el manejo de la animación de varias etapas, disponible here!

Sólo es compatible con una única duración y la variante ajustada, pero probablemente voy a añadir más características.

Así es como usted lo utiliza:

// Create New Animation 
MSAnimation * newAnimation = [MSAnimation newAnimationWithDuration:0.35 andOptions:UIViewAnimationOptionCurveEaseInOut]; 

// Add Sequence 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x, greenView.center.y + 100); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x + 100, greenView.center.y); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x, greenView.center.y + 100); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.center = CGPointMake(greenView.center.x - 50, greenView.center.y); 
}]; 
[newAnimation addNewAnimationStage:^{ 
    greenView.frame = CGRectMake(0, 0, 100, 100); 
}]; 

// Animate Your Sequence With Completion 
[newAnimation animateSequenceWithCompletion:^{ 
    NSLog(@"All finished!"); 
}]; 

le ofrece:

Animation Demo

Cuestiones relacionadas