2014-11-03 24 views
8

Voglio realizzare nuovo metodo, ho cercato molto su Google e StackOverflow, ma non ho trovato un esempioAnimate presentazione personalizzata di ViewController in OS X Yosemite

- (void)presentViewController:(NSViewController *)viewController animator:(id <NSViewControllerPresentationAnimator>)animator 

questo metodo è disponibile in OSX 10.10 e questo metodo necessario implementare il protocollo wich NSViewControllerPresentationAnimator ha questo due metodi

- (void)animatePresentationOfViewController:(NSViewController *)viewController fromViewController:(NSViewController *)fromViewController 

- (void)animateDismissalOfViewController:(NSViewController *)viewController fromViewController:(NSViewController *)fromViewController 

questo metodi ci permettono di fare un'animazione personalizzata tra due NSViewController di ho bisogno di un examople di implementazione, ho questo codice

- (IBAction)openTask:(id)sender { 

    NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    Tasks *task = [storyboard instantiateControllerWithIdentifier:@"tasks"]; 
    [self presentViewController:task animator:self]; 

} 

- (void)animatePresentationOfViewController:(NSViewController *)viewController 
         fromViewController:(NSViewController *)fromViewController 
{ 


} 

- (void)animateDismissalOfViewController:(NSViewController *)viewController 
         fromViewController:(NSViewController *)fromViewController 
{ 


} 

Qualcuno mi può aiutare con un esempio di come avrei potuto implementato questa transizione Grazie mille.

+0

C'è altro aiuto di cui hai bisogno o il mio esempio è sufficiente? –

+0

sì, va bene, la tua risposta ha risolto il mio problema, grazie mille ... – Imodeveloper

risposta

12

Ecco una versione semplice (Swift) che sfuma nella vista del nuovo viewcontroller. Sono sicuro che puoi tradurlo in Objective-C.

Si vuole utilizzare effettivamente Autolayout invece di cambiare il telaio, ma che avrebbe fatto l'esempio un po 'più a lungo (non troppo difficile. Basta aggiungere vincoli dopo aver aggiunto la vista)

Non sono sicuro se è necessario anche il contenimento del viewcontroller. Quindi devono essere necessarie le chiamate appropriate a addChildViewController e così via. Forse qualcuno può far luce su quando questo potrebbe essere necessario o se è in ogni caso una buona pratica.

class MyTransitionAnimator: NSObject, NSViewControllerPresentationAnimator { 

    func animatePresentationOfViewController(viewController: NSViewController, fromViewController: NSViewController) { 

     let bottomVC = fromViewController 
     let topVC = viewController 

     // make sure the view has a CA layer for smooth animation 
     topVC.view.wantsLayer = true 

     // set redraw policy 
     topVC.view.layerContentsRedrawPolicy = .OnSetNeedsDisplay 

     // start out invisible 
     topVC.view.alphaValue = 0 

     // add view of presented viewcontroller 
     bottomVC.view.addSubview(topVC.view) 

     // adjust size 
     topVC.view.frame = bottomVC.view.frame 

     // Do some CoreAnimation stuff to present view 
     NSAnimationContext.runAnimationGroup({ (context) -> Void in 

      // fade duration 
      context.duration = 2 
      // animate to alpha 1 
      topVC.view.animator().alphaValue = 1 

     }, completionHandler: nil) 

    } 

    func animateDismissalOfViewController(viewController: NSViewController, fromViewController: NSViewController) { 

     let bottomVC = fromViewController 
     let topVC = viewController 

     // make sure the view has a CA layer for smooth animation 
     topVC.view.wantsLayer = true 

     // set redraw policy 
     topVC.view.layerContentsRedrawPolicy = .OnSetNeedsDisplay 

     // Do some CoreAnimation stuff to present view 
     NSAnimationContext.runAnimationGroup({ (context) -> Void in 

      // fade duration 
      context.duration = 2 
      // animate view to alpha 0 
      topVC.view.animator().alphaValue = 0 

     }, completionHandler: { 

      // remove view 
      topVC.view.removeFromSuperview() 
     }) 

    } 
} 

Spero che questo ti aiuti!

+1

Oh, e assicurati di leggere http://jwilling.com/osx-animations prima di cambiare il frame usando Core Animation. È un articolo eccellente! –

Problemi correlati