我点击特定按钮后试图为我的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,但它对我不起作用。
答案 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