可可 - 动画片NSWindow

时间:2016-04-02 11:18:21

标签: swift macos cocoa

我点击特定按钮后试图为我的NSWindow设置动画,所以我写了一个函数:

func fadeIn(window: NSWindow, duration: NSTimeInterval) {
    var alpha = 0.0 as CGFloat
    window.alphaValue = alpha
    window.makeKeyAndOrderFront(nil)
    let numberOfLoops = Int(duration / 0.02)
    let alphaChangeInLoop = (CGFloat(1.0) / CGFloat(numberOfLoops))
    var loopRun = 0
    for _ in 0...numberOfLoops {
        loopRun += 1
        alpha += alphaChangeInLoop
        window.alphaValue = alpha
        NSThread.sleepForTimeInterval(0.020)
    }
    print("Loop was run \(loopRun) times. Ending alpha: \(alpha)")
    if alpha != 1.0 {
        alpha = 1.0
        window.alphaValue = 1.0
        print("Alpha set to 1.0")
    }
}

对我来说似乎没问题,但事实并非如此 - 窗口没有淡入。它只是出现在持续时间字段中的任何内容之后(所以它可能不接受任何低于1.0的alphaValue)。

是否可以在OSX应用程序中为alphaValue设置动画?我一直在搜索这个论坛,我找到了一些其他方法,包括NSAnimationContext,但它对我不起作用。

1 个答案:

答案 0 :(得分:4)

您的方法存在的问题是,当您让执行流程返回主事件循环时,窗口通常只会重绘。直到最后你才这样做。您可以尝试强制窗口重新绘制循环的每次迭代,但不要打扰。

动画内置于Cocoa。试试这个:

    window.alphaValue = 0
    window.makeKeyAndOrderFront(nil)
    NSAnimationContext.runAnimationGroup({ (context) -> Void in
        context.duration = duration
        window.animator().alphaValue = 1
    }, completionHandler: nil)

如果您的默认持续时间为0.25秒,则可以执行以下操作:

    window.alphaValue = 0
    window.makeKeyAndOrderFront(nil)
    window.animator().alphaValue = 1

您还应该知道,Cocoa默认情况下会将动画应用于Windows。你应该考虑让它做它的事情。如果你坚持接管它,你应该这样做:

    window.animationBehavior = .None