2016-04-02 51 views
1

我試圖動畫我NSWindow我點擊一個特定的按鈕後,所以我寫了一個函數:可可 - 動畫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") 
    } 
} 

這似乎爲我好,但它不是 - 窗口不褪色in。它出現在無論我放在持續時間字段(因此它可能不接受任何低於1.0的alphaValue)。

是否可以在OSX應用程序中爲alphaValue設置動畫效果?我一直在尋找這個論壇,我發現了一些其他的方式,包括NSAnimationContext,但它並沒有爲我工作。

回答

3

您的方法存在的問題是,當您讓執行流程返回到主事件循環時,窗口通常只會重繪。直到最後你纔會這樣做。你可以嘗試強制窗口爲你的循環的每次迭代重繪,但不要打擾。

動畫內置於可可。試試這個:

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 

你也應該知道,可可應用於動畫窗口,默認情況下。你應該考慮讓它做它的事情。如果你堅持接管它,你應該可以這樣做:

window.animationBehavior = .None 
+0

像魔術一樣工作。我嘗試使用這一個,並有相同的代碼,但我忘了在NSWindow之後添加「.animator()」。小事很重要。非常感謝! – Ancinek