2011-10-17 8 views
21

Tengo una animación muy simple en iOS que se desvanece en una vista, cambia el tamaño de un contenedor para adaptarse a otra vista y luego desvanece esa otra vista. Es bastante fácil de hacer y muy sencillo.¿Cómo haré esta animación de iOS en OSX?

He estado tratando de hacer algo muy parecido a esto en OSX, pero no he podido encontrar la manera de hacerlo. Las cosas de animación en OSX se sienten tan torpes y difíciles en comparación con iOS.

¡Cualquier ayuda sería muy apreciada!

Gracias! :)

// Fade out viewOne, resize frame to fit viewTwo, fade in viewTwo 
[UIView animateWithDuration: 0.15 
     animations: ^{ 
      [viewOne setAlpha:0.0]; 
     } 
     completion: ^(BOOL finished) { 
      [UIView animateWithDuration: 0.2 
        animations: ^{ 
         [self setFrame: [viewTwo frame]]; 
        } 
        completion: ^(BOOL finished) { 
         [viewTwo setAlpha: 0.0]; 
         [self addSubview: viewTwo]; 
         [UIView animateWithDuration: 0.15 
           animations: ^{ 
            [viewTwo setAlpha:1.0]; 
           }]; 
        }]; 
     }]; 

Respuesta

21

He escrito una pequeña clase que utiliza bloques de lograr esencialmente el mismo que el anterior cuando se utiliza el proxy animador en OSX.

Tenga en cuenta que esta clase no es segura para subprocesos y no se ha sometido a ninguna prueba específica o estresante.

//Interface 
@interface MZAnimator : NSObject{} 

+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock; 
+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock 
       completion:(void (^)(void))completionBlock; 
@end 


//Implementation 
@interface MZAnimator() 
+ (void)runEndBlock:(void (^)(void))completionBlock; 
@end 

@implementation MZAnimator 

+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock 
{ 
    [self animateWithDuration:duration animation:animationBlock completion:nil]; 
} 
+ (void)animateWithDuration:(NSTimeInterval)duration 
        animation:(void (^)(void))animationBlock 
       completion:(void (^)(void))completionBlock 
{ 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:duration]; 
    animationBlock(); 
    [NSAnimationContext endGrouping]; 

    if(completionBlock) 
    { 
    id completionBlockCopy = [[completionBlock copy] autorelease]; 
    [self performSelector:@selector(runEndBlock:) withObject:completionBlockCopy afterDelay:duration]; 
    } 
} 

+ (void)runEndBlock:(void (^)(void))completionBlock 
{ 
    completionBlock(); 
} 
@end 
+3

bonito :-) solución para hacer que sea aún más como 'UIView' esto podría ser implementado como una categoría de' NSView'; las animaciones se invocarían como métodos de clase de 'NSView'. –

+0

¡Una gran idea! Algunas funciones de clase podrían simplificar y refinar el uso. ¡Gracias! – Tyler

+0

muy bueno !!!!!!!!! – SpaceDog

17

Se puede utilizar:

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 
    [context setDuration:2.0]; 
    //Animation code 
    } completionHandler:^{ 
    //Completion Code 
    NSLog(@"Completed"); 
    }]; 
+1

He intentado esto y su basura. Es tan lento y lento y cuando se usa con objetos como NSButtons, el color de fondo desaparece cuando comienza la animación. –

Cuestiones relacionadas