单击特定按钮后,我试图为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,但对我不起作用。
您的方法的问题在于,通常仅在让执行流返回主事件循环时才重绘窗口。直到最后您都不会这样做。您可以尝试强制窗口为循环的每次迭代重绘,但不要打扰。
动画内置于可可中。尝试这个:
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)
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |