【发布时间】:2015-01-08 16:38:34
【问题描述】:
OS X Yosemite 引入 NSStoryboardSegue
更新:
• 如果我尝试在 Yosemite 的 Storyboard 中使用 NSStoryboardSegue 子类,它会因 SIGABRT 而崩溃。
• 如果我忽略 segue,并使用指定的自定义动画器手动呈现视图控制器以进行演示和关闭,
func presentViewController(_ viewController: NSViewController,
animator animator: NSViewControllerPresentationAnimator)
它按预期工作。
这篇文章提供了额外的见解:Animate custom presentation of ViewController in OS X Yosemite
以此作为参考,这是我迄今为止的尝试:
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()
})
}
}
【问题讨论】:
-
你有没有想过这个问题?它不需要故事板,因为默认演示动画与 nib 一起使用。我想这样做是为了最终以更少的样板更轻松地加载视图
-
@uchuugaka - 见我的answer,并附上sample project
-
@foundry 写得真好!在问了之后,我实际上自己想出了一点。我发现它非常简单,并表明它实际上只是一个股票方法存根
-
至少对我而言,将其用作加载视图的位置并将其粘贴在窗口或弹出窗口或其他任何东西中并设置退出策略的效果很好。
标签: objective-c macos swift osx-yosemite