2014-11-03 2 views
8

ich neue Methode implementieren möchten, suchte ich eine Menge auf Google und Stackoverflow, aber ich habe nicht ein BeispielAnimate individuelle Präsentation von Viewcontroller in OS X Yosemite

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

diese Methode ist in OSX 10.10 und diese gefunden Verfahren müssen das Protokoll NSViewControllerPresentationAnimator wich hat diese beiden Methoden

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

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

diese Methoden uns benutzerdefinierte Animation tun, damit implementieren zwischen zwei NSViewController des ich eine examople der Implementierung benötigen, habe ich diesen Code

- (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 
{ 


} 

Kann mir jemand helfen mit einem Beispiel dafür, wie ich Vielen Dank diesem Übergang umgesetzt haben könnte.

+0

Gibt es mehr Hilfe, die Sie brauchen oder ist mein Beispiel genug? –

+0

Ja, es ist OK, Ihre Antwort hat mein Problem gelöst, vielen Dank ... – Imodeveloper

Antwort

12

Hier ist eine einfache Version (Swift), die in der Ansicht des neuen Viewcontrollers eingeblendet wird. Ich bin sicher, dass Sie das in Objective-C übersetzen können.

Sie wollen tatsächlich Automatische Anordnung verwenden, anstatt nur den Rahmen zu ändern, sondern dass das Beispiel etwas länger gemacht hätte (nicht allzu schwierig. Gerade Einschränkungen hinzu, nachdem Sie die Ansicht hinzufügen)

Ich bin nicht sicher wenn Sie Viewcontrol-Eindämmung auch benötigen. Dann müsste es die entsprechenden Aufrufe an addChildViewController und so weiter geben. Vielleicht kann jemand aufklären, wann dies notwendig sein könnte oder ob es tatsächlich eine gute Praxis ist.

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() 
     }) 

    } 
} 

Hoffe, dass Sie damit beginnen!

+1

Oh, und stellen Sie sicher, dass Sie http://jwilling.com/osx-animations lesen, bevor Sie den Rahmen mit Core Animation ändern. Es ist ein ausgezeichneter Artikel! –