Penso che il modo più semplice è quello di scambiare contentViewController
di NSWindow
.
// in NSViewController's subclass
@IBAction func someAction(sender: AnyObject) {
let nextViewController = ... // instantiate from storyboard or elsewhere
if let window = view.window where window.styleMask & NSFullScreenWindowMask > 0 {
// adjust view size to current window
nextViewController.view.frame = CGRectMake(0, 0, window.frame.width, window.frame.height)
}
view.window?.contentViewController = nextViewController
}
Questa è l'opzione n.
Se si desidera utilizzare il seguito, crearne uno personalizzato e impostarlo sulla classe seguito con identificatore in 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
}
}
}
}
Questa è l'opzione n.
L'ultima opzione utilizza presentViewController:animator:
di NSViewController
. Il codice seguente è personalizzato NSViewControllerPresentationAnimator
per l'animazione di dissolvenza.
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
})
}
}
}
Quindi presentare VC come questo.
@IBAction func replaceAction(sender: AnyObject) {
let nextViewController = ... // instantiate from storyboard or elsewhere
presentViewController(nextViewController, animator: ReplacePresentationAnimator())
}
di licenziamento, chiamare presentingViewController
s' dismissViewController:
nel VC presentato.
@IBAction func dismissAction(sender: AnyObject) {
presentingViewController?.dismissViewController(self)
}
Spero che questo aiuto.
Ho trovato che l'opzione 1 non funzionava in modalità schermo intero – jiminybob99
@ jiminybob99 grazie per aver segnalato! Ho aggiornato la risposta. – bluedome