如何使用 Objective C 淡化动画 hide/show window

How to fade animate hide/show window with Objective C

在 Objective C 中,是否可以在启动时隐藏我的应用程序 window,然后在某个时间点进行调用以执行愉快的淡入淡出动画来显示我的应用程序 window?

并不是说您需要知道这一点,但背景是我正计划从我的 Javascript 在 webkit 小部件中执行此操作。我已经建立了 Objective C <==> Javascript 桥。因此,当我的图表完成加载时,我从 Javascript 调用返回 Objective C 以告诉它显示 window 令人愉快的淡入淡出动画。

这是我试过的方法,但这没有淡入淡出效果 -- window 只是等待一秒钟(因为这些图表正在加载),然后快速弹出屏幕。我尝试更改 NSThread 延迟,但无济于事——只会减慢速度。

// ...in my app delegate...
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
{
    // NOTE THIS SAYS "WILL", NOT "DID" -- VERY IMPORTANT.
    // TO DO OTHERWISE WOULD GIVE YOU A WINDOW FLASH FOR A SECOND,
    // THEN FADE IN.
    [self hideWindow:_window];
}

- (void)hideWindow:(NSWindow *)window
{
    float alpha = 0.0;
    [window setAlphaValue:alpha];
    [window makeKeyAndOrderFront:self];
}

- (void)showWindow:(NSWindow *)window
{
    float alpha = 1.0;
    [window setAlphaValue:alpha];
    [window makeKeyAndOrderFront:self];
}

- (void)fadeOutWindow:(NSWindow*)window
{
    float alpha = 1.0;
    [window setAlphaValue:alpha];
    [window makeKeyAndOrderFront:self];
    for (int x = 0; x < 10; x++) {
        alpha -= 0.1;
        [window setAlphaValue:alpha];
        [NSThread sleepForTimeInterval:0.020];
    }
}

- (void)fadeInWindow:(NSWindow*)window
{
    float alpha = 0.0;
    [window setAlphaValue:alpha];
    [window makeKeyAndOrderFront:self];
    for (int x = 0; x < 10; x++) {
        alpha += 0.1;
        [window setAlphaValue:alpha];
        [NSThread sleepForTimeInterval:0.020];
    }
}

// My javascript to ObjC bridge calls this:
- (void)callShowAppWindow;
{
    [self fadeInWindow:_window];
}

与其隐藏 window,不如创建一个占据初始 window 空间的 splash/loading 页面,然后在您的实际 window 上做一些花哨的动画数据已加载或您的应用已准备就绪?

在我关于这个问题的来源中,我几乎得到了它。这是导致淡入淡出效果的两个函数的修复:

- (void)fadeOutWindow:(NSWindow*)window
{
    float alpha = 1.0;
    [window setAlphaValue:alpha];
    [window makeKeyAndOrderFront:self];
    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:1.5f];
    [[window animator] setAlphaValue:0.f];
    [NSAnimationContext endGrouping];
}

- (void)fadeInWindow:(NSWindow*)window
{
    float alpha = 0.0;
    [window setAlphaValue:alpha];
    [window makeKeyAndOrderFront:self];
    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:1.5f];
    [[window animator] setAlphaValue:1.f];
    [NSAnimationContext endGrouping];
}

只需使用 NSAnimationContext 动画来制作动画 alpha 属性:

- (void)fadeInWindow:(NSWindow *)window {
    [window setAlphaValue:0.0];
    [window makeKeyAndOrderFront:self];
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
      [context setDuration:2.0];
      [window setAlphaValue: 1.0f];
    } completionHandler:^{ // or put nil instead of block
      NSLog(@"Completed");
    }]; 
}

同样的方法淡出你的 window:

- (void)fadeOutWindow:(NSWindow*)window {
    [window setAlphaValue:1.0f];
    [window makeKeyAndOrderFront:self];
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
      [context setDuration:2.0];
      [window setAlphaValue: 0.0f];
    } completionHandler:nil];
}

您甚至可以将其合并为一种方法:

- (void)fadeWindow:(NSWindow *)window in:(BOOL)in {
  [window setAlphaValue: in ? 0.0f : 1.0f];
  [window makeKeyAndOrderFront: self];
  [NSAnimationContext runAnimationGroup: ^(NSAnimationContext *context) {
    [context setDuration: 2.0f]; // or whatever you need
    [window setAlphaValue: in ? 1.0f : 0.0f];
  } completionHandler: nil];
}