Código de amostra NSStoryboardSegue (Yosemite Storyboard)
Introdução ao OS X YosemiteNSStoryboardSegue
Atualizar:
• Se eu tentar usar uma subclasse NSStoryboardSegue em um Storyboard com Yosemite., Ela trava com o SIGABRT.
• Se eu ignorar os itens a seguir e apresentar manualmente um controlador de exibição usando um animador personalizado especificado para apresentação e dispensa,
func presentViewController(_ viewController: NSViewController,
animator animator: NSViewControllerPresentationAnimator)
funciona como esperado.
Esta postagem fornece informações adicionais:Animar a apresentação personalizada do ViewController no OS X Yosemite
Usando isso como referência, aqui está minha tentativa até agora:
class FadeSegue: NSStoryboardSegue {
override func perform() {
super.perform()
sourceController.presentViewController(destinationController as NSViewController,
animator: FadeTransitionAnimator())
}
}
class FadeTransitionAnimator: NSObject, NSViewControllerPresentationAnimator {
func animatePresentationOfViewController(toViewController: NSViewController, fromViewController: NSViewController) {
toViewController.view.wantsLayer = true
toViewController.view.layerContentsRedrawPolicy = .OnSetNeedsDisplay
toViewController.view.alphaValue = 0
fromViewController.view.addSubview(toViewController.view)
toViewController.view.frame = fromViewController.view.frame
NSAnimationContext.runAnimationGroup({ context in
context.duration = 2
toViewController.view.animator().alphaValue = 1
}, completionHandler: nil)
}
func animateDismissalOfViewController(viewController: NSViewController, fromViewController: NSViewController) {
viewController.view.wantsLayer = true
viewController.view.layerContentsRedrawPolicy = .OnSetNeedsDisplay
NSAnimationContext.runAnimationGroup({ (context) -> Void in
context.duration = 2
viewController.view.animator().alphaValue = 0
}, completionHandler: {
viewController.view.removeFromSuperview()
})
}
}