如何使用Objective C淡化隐藏/显示窗口的动画

时间:2015-12-11 20:17:22

标签: objective-c macos cocoa animation fade

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

不是你需要知道这一点,但背景是我计划从webkit小部件的Javascript中做到这一点。我已经建立了目标C< ==> Javascript桥。因此,当我的图表完成加载后,我将从Javascript调用回到Objective C,告诉它显示带有令人愉快的淡入淡出动画的窗口。

这是我尝试过的,但这没有淡入淡出效果 - 窗口等待一秒钟(因为这些图表正在加载)然后只是快速弹出屏幕。我尝试更改NSThread延迟,但它没有任何帮助 - 这只会减慢更多。

myapp.tests.Tests.test_somespecificthing

3 个答案:

答案 0 :(得分:2)

在我的问题来源中,我几乎拥有它。这里修复了导致淡入淡出效果的两个函数:

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

答案 1 :(得分:1)

只需使用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");
    }]; 
}

用淡出窗口的方法:

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

答案 2 :(得分:0)

而不是隐藏窗口而不是创建一个启动/加载页面占用初始窗口空间,然后在数据加载或应用程序准备好之后用实际窗口做一些奇特的动画?