10

ユーザーが特定の領域にカーソルを合わせると、新しいビューが引き出しのようなアニメーションで表示される機能を実装したいと考えています。また、ユーザーが特定の領域を離れると、ドロワーはアニメーションとともに消えます。これはまさに、OS X の画面の下部にカーソルを合わせると表示されるもので、Dock がアニメーションで表示および非表示になります。

ただし、アニメーション付きの機能を実装すると、アニメーションが完了するに特定の領域に再度入ると、正しく動作しません。mouseExited:これが私のコードです:

let trackingArea = NSTrackingArea(rect: CGRectMake(0, 0, 120, 300), options: NSTrackingAreaOptions.ActiveAlways | NSTrackingAreaOptions.MouseEnteredAndExited, owner: self, userInfo: nil)
underView.addTrackingArea(trackingArea) // underView is the dummy view just to respond to the mouse tracking, since the drawerView's frame is changed during the animation; not sure if this is the clean way...

override func mouseEntered(theEvent: NSEvent) {
    let frameAfterVisible = CGRectMake(0, 0, 120, 300)
    NSAnimationContext.runAnimationGroup({
        (context: NSAnimationContext!) in
            context.duration = 0.6
            self.drawerView.animator().frame = frameAfterVisible
        }, completionHandler: { () -> Void in
    })
}

override func mouseExited(theEvent: NSEvent) {
    let frameAfterInvisible = CGRectMake(-120, 0, 120, 300)
    NSAnimationContext.runAnimationGroup({
        (context: NSAnimationContext!) in
            context.duration = 0.6
            self.drawerView.animator().frame = frameAfterInvisible
        }, completionHandler: { () -> Void in
    })
}

// drawerView's frame upon launch is (-120, 0, 120, 300), since it is not visible at first

このコードでは、位置drawerViewを変更してをアニメーション化しxます。ただし、前述したように、トラッキング エリアに入ってからトラッキング エリアを離れると、ドロワーは正常に機能します。ただし、リーブオフ アニメーションが完全に完了する前にトラッキング エリアに再び入った場合は、この限りではありません。

もちろん、アニメーションの長さを のように短く設定すると0.1、これはほとんど発生しなくなります。でもアニメーションでビューを動かしたい。

私がやりたいのは、ビューが完全に消えていなくても、drawerView再び開始を開始することです。それを行うための練習はありますか?

4

2 に答える 2

10

Swift 3 を起動します。次のようにする必要があります。

let trackingArea = NSTrackingArea(rect: CGRectMake(0, 0, 120, 300), options: [NSTrackingAreaOptions.ActiveAlways ,NSTrackingAreaOptions.MouseEnteredAndExited], owner: self, userInfo: nil)
view.addTrackingArea(trackingArea)

上記の@marcのクレジット!

于 2016-07-01T03:36:56.430 に答える