可可-动画NSWindow

Anc*_*nek 2 macos cocoa swift

单击特定按钮后,我试图为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")
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说似乎可以,但不能-窗口不会淡入。它只出现在我在工期字段中输入的内容之后(因此它可能不接受任何低于1.0的alphaValue)。

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

Ken*_*ses 6

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

动画内置于可可中。尝试这个:

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

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

    window.alphaValue = 0
    window.makeKeyAndOrderFront(nil)
    window.animator().alphaValue = 1
Run Code Online (Sandbox Code Playgroud)

您还应该知道,默认情况下,可可将动画应用于窗口。您应该考虑让它做自己的事情。如果您坚持要接管,那么您可能应该这样做:

    window.animationBehavior = .None
Run Code Online (Sandbox Code Playgroud)