我認爲最簡單的方法就是交換contentViewController
的NSWindow
。
這是選項#1。
如果要使用segue,請創建自定義的一個,並將其設置爲在IB中標識具有標識符的類。
class ReplaceSegue: NSStoryboardSegue {
override func perform() {
if let fromViewController = sourceController as? NSViewController {
if let toViewController = destinationController as? NSViewController {
// no animation.
fromViewController.view.window?.contentViewController = toViewController
}
}
}
}
這是選項#2。
最後一個選項是使用presentViewController:animator:
的NSViewController
。下面的代碼是自定義NSViewControllerPresentationAnimator
溶解動畫。
class ReplacePresentationAnimator: NSObject, NSViewControllerPresentationAnimator {
func animatePresentationOfViewController(viewController: NSViewController, fromViewController: NSViewController) {
if let window = fromViewController.view.window {
NSAnimationContext.runAnimationGroup({ (context) -> Void in
fromViewController.view.animator().alphaValue = 0
}, completionHandler: {() -> Void in
viewController.view.alphaValue = 0
window.contentViewController = viewController
viewController.view.animator().alphaValue = 1.0
})
}
}
func animateDismissalOfViewController(viewController: NSViewController, fromViewController: NSViewController) {
if let window = viewController.view.window {
NSAnimationContext.runAnimationGroup({ (context) -> Void in
viewController.view.animator().alphaValue = 0
}, completionHandler: {() -> Void in
fromViewController.view.alphaValue = 0
window.contentViewController = fromViewController
fromViewController.view.animator().alphaValue = 1.0
})
}
}
}
然後提出這樣的VC。
@IBAction func replaceAction(sender: AnyObject) {
let nextViewController = ... // instantiate from storyboard or elsewhere
presentViewController(nextViewController, animator: ReplacePresentationAnimator())
}
解僱,叫presentingViewController
的dismissViewController:
所呈現的VC。
@IBAction func dismissAction(sender: AnyObject) {
presentingViewController?.dismissViewController(self)
}
希望得到這個幫助。
我發現選項1沒有在全屏模式下工作 – jiminybob99 2016-09-22 17:32:23
@ jiminybob99感謝您的舉報!我更新了答案。 – bluedome 2016-09-26 07:08:52