ユーザーが特定の領域にカーソルを合わせると、新しいビューが引き出しのようなアニメーションで表示される機能を実装したいと考えています。また、ユーザーが特定の領域を離れると、ドロワーはアニメーションとともに消えます。これはまさに、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
再び開始を開始することです。それを行うための練習はありますか?