Я хочу реализовать функцию, которая, когда пользователь наводится на определенную область, появляется новый вид с анимацией, подобной ящику. А также, когда пользователь покидает определенную область, ящик должен уходить с анимацией. Это именно то, что вы видите, когда вы нависаете над нижней частью экрана в OS X, где Dock появляется и исчезает с анимацией.Как реализовать NSTrackingArea's mouseEntered/Exited с анимацией?
Однако, если я реализовать функцию с анимацией, он не работает должным образом, когда вы вновь войти в конкретную область перед тем анимация в 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
, даже если вид не завершен, исчезает. Есть ли практика для этого?
Вызывается функция 'mouseEntered()' при повторном входе во время анимации? То есть, проблема заключается в том, что он не вызывается или это не означает, что настройка нового кадра неэффективна? Поместите некоторые записи в обе функции, перед группой анимации, в конце группы анимации и в обработчике завершения. –