objective-ccocoafadeappkitnsviewanimation

How to fade out a NSView with animation?


This is as simple as can be so I can't for the life of me find what's wrong, I looked through the documentation as a guide but it still didn't work. I have a view inside a larger view. An IBAction is supposed to fade out the inner view... that's it. Here's what I've got:

NSViewAnimation *theAnim;
NSMutableDictionary *viewDict;

// Create the attributes dictionary for the view.
viewDict = [NSMutableDictionary dictionaryWithCapacity:2];

// Set the target object to be the view.
[viewDict setObject:_innerView forKey:NSViewAnimationTargetKey];

// Set this view to fade out
[viewDict setObject:NSViewAnimationFadeOutEffect forKey:NSViewAnimationEffectKey];

theAnim = [[NSViewAnimation alloc] initWithViewAnimations:@[viewDict]];

// Set some additional attributes for the animation.
[theAnim setDuration:1.0];

// Run the animation.
[theAnim startAnimation];

I checked the viewDict and theAnim with NSLog and neither are nil. I pretty much copied this from an old program I had where this was working, can't find what's wrong now.

I'm using Xcode 5.1.1.


Solution

  • The modern approach is much easier:

    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
        context.duration = 1;
        view.animator.alphaValue = 0;
    }
    completionHandler:^{
        view.hidden = YES;
        view.alphaValue = 1;
    }];
    

    If the view hierarchy is layer-backed, it's actually sufficient to do:

    view.animator.hidden = YES;