2011-10-17 11 views
21

Ho un'animazione molto semplice in iOS che sfuma una vista, ridimensiona un contenitore per adattarlo a un'altra vista, quindi dissolve l'altra vista. È abbastanza facile da fare e molto semplice.Come dovrei fare questa animazione iOS su OSX?

Ho cercato di fare qualcosa di simile esattamente su OSX, ma non sono stato in grado di capire come farlo. Le animazioni su OSX si sentono così goffe e difficili rispetto a iOS.

Qualsiasi aiuto sarebbe molto apprezzato !!

Grazie! :)

// 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]; 
           }]; 
        }]; 
     }]; 

risposta

21

Ho scritto una piccola classe che utilizza i blocchi per raggiungere essenzialmente la stessa cosa come sopra quando si utilizza il proxy animatore su OSX.

Si prega di notare che questa classe non è thread-safe e non ha subito alcun test specifico o stressante.

//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

bella soluzione :-) Per rendere ancora più simile a 'UIView' questo potrebbe essere implementato come una categoria di' NSView'; le animazioni sarebbero quindi invocate come metodi di classe di 'NSView'. –

+0

Una grande idea! Alcune funzioni di classe potrebbero semplificare e perfezionare l'utilizzo. Grazie! – Tyler

+0

molto buono !!!!!!!!! – SpaceDog

17

È possibile utilizzare:

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

Ho provato questo e la sua spazzatura. È lento e lento e quando si utilizzano oggetti come NSButton, il colore di sfondo scompare all'avvio dell'animazione. –

Problemi correlati