gpt4 book ai didi

swift - Cocoa - 动画 NSWindow

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:41 28 4
gpt4 key购买 nike

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

最佳答案

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

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

关于swift - Cocoa - 动画 NSWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36372547/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com