2016-04-02 19 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") 
    } 
} 

それは私のためにOKと思われるが、それはありませんデュレーションフィールドに何を置いたとしても表示されます(したがって、おそらく1.0より下のalphaValueは受け入れられません)。

OSXアプリケーションでalphaValueをアニメーション化することはできますか?私はこのフォーラムを検索していましたが、NSAnimationContextを含むいくつかの方法を見つけましたが、それは私のためには機能しませんでした。

答えて

3

問題は、実行フローをメインイベントループに戻すときにウィンドウを再描画することです。あなたは終わりまでこれをやっていません。ループの繰り返しごとにウィンドウを強制的に再描画することができますが、気にしないでください。

アニメーションはCocoaに組み込まれています。これを試してください:あなたは0.25秒のデフォルトの継続時間とOKなら

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

、あなただけ行うことができます。

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

ます。また、デフォルトでは、ココアが窓にアニメーションを適用されることに注意する必要があります。あなたはそれが自分のことをすることだけを考慮する必要があります。あなたがそれを引き継ぐことを強く求めるなら、あなたはおそらくそうするべきです:

window.animationBehavior = .None 
+0

魔法のように働きます。私はこのコードを使ってみましたが、同じコードを持っていましたが、NSWindowの後に ".animator()"を追加するのを忘れました。小さなことが重要です。どうもありがとう! – Ancinek

関連する問題