Swift Cocoa-动画窗口

Swift Cocoa-动画窗口,swift,macos,cocoa,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 alph

我试图在单击特定按钮后设置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")
    }
}
这对我来说似乎没问题,但事实并非如此——窗户不会褪色。它只出现在我在duration字段中输入的内容之后(因此它可能不接受任何低于1.0的字母值)


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

你的方法的问题是,通常只有当执行流返回到主事件循环时,窗口才会重新绘制。你要到最后才能这么做。您可以尝试强制窗口为循环的每个迭代重新绘制,但不要麻烦

动画内置于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

就像魔术一样。我试着使用这一个,但我忘了在NSWindow之后添加“.animator()”。小事很重要。谢谢!