Cocoa - 动画 NSWindow

4

我想在点击特定按钮后使我的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个回答

10
你的方法存在一个问题,即窗口通常只有在将执行流返回到主事件循环时才重新绘制。你直到最后才这样做。你可以尝试强制让窗口在每次循环迭代时重新绘制,但没必要这么麻烦。
动画已经内置在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默认会对窗口应用动画效果。你可以考虑让它自己处理。如果你坚持要接管它的工作,那么你应该考虑执行以下操作:

    window.animationBehavior = .None

就像魔术一样。我尝试使用这个代码,但是我忘记在NSWindow后面添加“.animator()”。细节决定成败。非常感谢! - mdmb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接