Swift Cocoa-动画窗口
我试图在单击特定按钮后设置NSWindow的动画,因此我编写了一个函数: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
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()”。小事很重要。谢谢!