Общая цель: использовать настраиваемый сегмент раскадровки в macOS
Проблема заключается в цепочке респондентов. Согласно Apple:
Кроме того, в macOS 10.10 и более поздних версиях контроллер представления участвует в цепочке респондентов. NSViewController
Если я использую стандартный переход в раскадровке macOS, целевой контроллер представления ведет себя так, как ожидалось - фокус, ключевые эквиваленты, цепочка респондентов и т. Д.
Однако, если я использую настраиваемый переход, контроллер представления назначения не будет вести себя так, как ожидалось :( В частности, ключевые эквиваленты загадочным образом не работают - однако при тестировании ключевые эквиваленты кнопки на контроллере представления источника продолжают работать (что бесполезно / нежелательно)
В macOS 10.12 я использую следующий настраиваемый переход… Что я делаю не так?
class PushSegue: NSStoryboardSegue {
override func perform() {
(sourceController as AnyObject).presentViewController(destinationController as! NSViewController, animator: PushAnimator())
}
}
class PushAnimator: NSObject, NSViewControllerPresentationAnimator {
func animatePresentation(of viewController: NSViewController, from fromViewController: NSViewController) {
viewController.view.wantsLayer = true
viewController.view.frame = CGRect(x: fromViewController.view.frame.size.width, y: 0,
width: fromViewController.view.frame.size.width, height: fromViewController.view.frame.size.height)
fromViewController.addChildViewController(viewController)
fromViewController.view.addSubview(viewController.view)
let futureFrame = CGRect(x: 0, y: 0, width: viewController.view.frame.size.width,
height: viewController.view.frame.size.height)
NSAnimationContext.runAnimationGroup({ context in
context.duration = 0.75
viewController.view.animator().frame = futureFrame
}, completionHandler:nil)
}
func animateDismissal(of viewController: NSViewController, from fromViewController: NSViewController) {
let futureFrame = CGRect(x: viewController.view.frame.size.width, y: 0,
width: viewController.view.frame.size.width, height: viewController.view.frame.size.height)
NSAnimationContext.runAnimationGroup({ context in
context.duration = 0.75
context.completionHandler = {
viewController.view.removeFromSuperview()
viewController.removeFromParentViewController()
}
viewController.view.animator().frame = futureFrame
}, completionHandler: nil)
}
}