2016-04-02 12 views
1

Ich versuche, meine NSWindow zu animieren, nachdem ich eine bestimmte Schaltfläche klicken, so schrieb ich eine Funktion:Cocoa - Animieren 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") 
    } 
} 

Es scheint für mich in Ordnung, aber es ist nicht - das Fenster nicht verblassen in. Es erscheint einfach nach was auch immer ich in das Dauerfeld eingetragen habe (also akzeptiert es wahrscheinlich keinen alphaValue unter 1.0).

Ist es möglich, AlphaValue in OSX-Anwendung zu animieren? Ich habe dieses Forum gesucht und ich habe einige andere Möglichkeiten gefunden, einschließlich NSAnimationContext, aber es hat nicht für mich funktioniert.

Antwort

3

Das Problem mit Ihrer Vorgehensweise besteht darin, dass das Fenster in der Regel nur neu gezeichnet wird, wenn Sie den Ausführungsablauf in die Hauptereignisschleife zurückgeben. Du machst das nicht bis zum Ende. Sie könnten versuchen, das Fenster für jede Iteration Ihrer Schleife neu zu zeichnen, aber nicht stören.

Animation ist in Cocoa integriert. Versuchen Sie folgendes:

window.alphaValue = 0 
    window.makeKeyAndOrderFront(nil) 
    NSAnimationContext.runAnimationGroup({ (context) -> Void in 
     context.duration = duration 
     window.animator().alphaValue = 1 
    }, completionHandler: nil) 

Wenn Sie mit der Standarddauer von 0,25 Sekunden OK sind, können Sie einfach tun:

window.alphaValue = 0 
    window.makeKeyAndOrderFront(nil) 
    window.animator().alphaValue = 1 

Sie sollten sich auch bewusst sein, dass Cocoa gilt Animationen Fenster, standardmäßig aktiviert. Du solltest darüber nachdenken, es einfach machen zu lassen. Wenn du darauf bestehst, es zu übernehmen, solltest du Folgendes tun:

window.animationBehavior = .None 
+0

Funktioniert wie Magie. Ich habe versucht, dieses zu verwenden und hatte den gleichen Code, aber ich habe vergessen, ".animator()" nach NSWindow hinzuzufügen. Kleine Dinge sind wichtig. Danke vielmals! – Ancinek