Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 223
Elbimio Avatar asked Aug 22 '14 21:08

Elbimio


2 Answers

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; 
like image 76
Ken Thomases Avatar answered Sep 23 '22 18:09

Ken Thomases


For those looking for a Swift version instead:

NSAnimationContext.runAnimationGroup({ context in     context.duration = 1     self.view.animator().alphaValue = 0 }, completionHandler: {     self.view.isHidden = true     self.view.alphaValue = 1 }) 

For layer-backed views, this is enough:

view.animator().isHidden = true 

For those already on Swift 5.3 or above, you can leverage the new Multiple Trailing Closures syntax sugar here for an even cleaner version:

NSAnimationContext.runAnimationGroup { context in     context.duration = 1     self.view.animator().alphaValue = 0 } completionHandler: {     self.view.isHidden = true     self.view.alphaValue = 1 } 
like image 34
Paulo Mattos Avatar answered Sep 23 '22 18:09

Paulo Mattos