我想实现一个功能,当用户将鼠标悬停在特定区域上时,新视图会出现类似抽屉的动画。而且,当用户离开特定区域时,抽屉应该以动画形式消失。这正是您在 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
start 再次出现,即使视图还没有完全消失。有什么练习可以做到吗?