使用NSViewAnimation无法淡入窗口

zer*_*tas 2 xcode cocoa objective-c osx-lion

请参阅代码段.尝试使用NSViewAnimation淡入其主窗口.NIB只有一个窗口/菜单(例如,这个项目几乎是直接来自cocoa app向导).通过取消选中"在启动时可见",在NIB中修改了窗口.永远不会调用委托方法animationShouldStart.如果它很重要我在xcode 4.2中的10.7.

我基本上只是不明白为什么这不起作用.请给我一些感觉.

谢谢

#import "TestAppDelegate.h"

@implementation TestAppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
  //  [[self window] orderFront: self];
    NSRect _saveRect = [_window  frame];
    NSRect _zeroRect = _saveRect;
    _zeroRect.size = NSMakeSize(0, 0);   
    NSDictionary *fadeInAttrs = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [_window contentView], NSViewAnimationTargetKey,
                                 NSViewAnimationFadeInEffect, NSViewAnimationEffectKey,
                                 [NSValue valueWithRect:_zeroRect], NSViewAnimationStartFrameKey,
                                 [NSValue valueWithRect:_saveRect], NSViewAnimationEndFrameKey,
                                 nil];

    NSViewAnimation *_viewAnimIn = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects: fadeInAttrs, nil]];

    [_viewAnimIn setDuration:1.0];
    [_viewAnimIn setAnimationCurve:NSAnimationEaseInOut];  
    [_viewAnimIn setAnimationBlockingMode:NSAnimationBlocking];
    [_viewAnimIn setDelegate:self];
    [_viewAnimIn startAnimation];
}

- (BOOL)animation:(NSAnimation *)animation animationShouldStart:(NSAnimation*) _anim
{
    NSLog(@"%@ shouldStart", _anim);
    return YES;
}

@end
Run Code Online (Sandbox Code Playgroud)

Rob*_*ger 6

这里有三个问题,其中一个肯定是不明显的.

首先,您的动画委托未被调用,因为您的委托方法的消息签名不正确,它应该是:

- (BOOL)animationShouldStart:(NSAnimation*) _anim
Run Code Online (Sandbox Code Playgroud)

其次,要在一个窗口中消失,你需要自己通过窗口作为对象NSViewAnimationTargetKey,而不是它的内容视图.

第三,如果窗口在屏幕上,但与零阿尔法值的效果淡入淡出窗口只会工作.

因此,在代码块的顶部插入:

[self.window orderFront:self];
[self.window setAlphaValue:0.0];
Run Code Online (Sandbox Code Playgroud)

这应该使窗口淡入动画工作就好了.但请注意,因为您没有更改窗口框架,所以可以将动画字典缩短为:

NSDictionary *fadeInAttrs = [NSDictionary dictionaryWithObjectsAndKeys:
                             _window, NSViewAnimationTargetKey,
                             NSViewAnimationFadeInEffect, NSViewAnimationEffectKey,
                             nil];
Run Code Online (Sandbox Code Playgroud)