2016-07-20 13 views
1

Ich möchte einen View Controller modal mit benutzerdefinierten Übergängen darstellen. Zur gleichen Zeit möchte ich sicherstellen, dass, wenn es entlassen wird, der View-Controller dahinter ist bekannt, in den Vordergrund geschoben werden.Trigger viewWillAppear bei Verwendung eines übergehenden Delegaten

Meine Grundidee ist es, einige verschiedene Konfigurationen auszuprobieren und zu sehen, welche zu viewWillAppear aufgerufen wird auf dem View-Controller dahinter.

Versuch 1

presentedViewController.modalPresentationStyle = .Custom 
presentedViewController.transitioningDelegate = someTransitioningDelegate 

Dies ist der Standard-Ansatz, und der benutzerdefinierte Übergang funktioniert perfekt in Ordnung, aber ich will viewWillAppear hinter presentedViewController auf den View-Controller aufgerufen werden, wenn ich presentedViewController.dismissViewControllerAnimated(true) nennen (was nicht geschehen). Also tat ich dies:

Versuch 2

presentedViewController.modalPresentationStyle = .FullScreen 
presentedViewController.transitioningDelegate = someTransitioningDelegate 

oder

presentedViewController.modalPresentationStyle = .FullScreen 
presentedViewController.modalTransitionStyle = .CoverVertical 
presentedViewController.transitioningDelegate = someTransitioningDelegate 

Jetzt viewWillAppear auf den View-Controller hinter presentedViewController aufgerufen wird, wenn presentedViewController entlassen, und der Übergang erfolgt wie erwartet, wenn präsentiert der View-Controller.

Wenn jedoch View-Controller zu entlassen, der Hintergrund während des Übergangs ist schwarz; scheint, dass .FullScreen bewirkt, dass die View-Controller hinter presentedViewController aus der View-Hierarchie entfernt werden - was gut ist, weil das vermutlich den Aufruf viewWillAppear auslöst.

Versuch 3

presentedViewController.modalPresentationStyle = .FullScreen 
presentedViewController.modalTransitionStyle = .CoverVertical 

Interessanterweise, wenn .CoverVertical angegeben ist, aber die transitioningDelegate nicht, dann wird der Hintergrund während des Übergangs tatsächlich wird der View-Controller hinter presentedViewController, liegt aber viewWillAppear wird aufgerufen der View-Controller hinter presentedViewController sowieso. Das einzige, was fehlt, ist der benutzerdefinierte Übergang.


Das Projekt arbeite ich an ist so strukturiert, dass es schwierig macht, eine Delegation zu verwenden (was die vorgeschlagene Antwort here zu sein scheint).Verwendung von NSNotificationCenter zu machen ist eine weitere Alternative, die mir den Code nennen wir die von viewWillAppear zu heißen soll, aber von Versuch 3, ich bin es Hoffnung, ist ein eleganter Ansatz, alle diese zu erreichen:

  1. Trigger-viewWillAppear
  2. Verwenden Sie einen benutzerdefinierten Übergang
  3. die view-Controller Siehe im Hintergrund während der Übergangsanimation

Antwort

3

Apple scheint es ein falsches Spiel hält viewWillAppear usw. aufzurufen, aber es ist okay, beginAppearanceTransition und endAppearanceTransition, which in turn will invoke viewWillAppear aufzurufen. Ich gehe damit.

0

die Art und Weise ich erreicht habe dies in der Vergangenheit durch den Aufruf viewWillAppear präsentiert und vie wDidAppear vom Übergang Animator. Hier ist ein vereinfachtes Beispiel:

public func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 

    let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 
    let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 

    fromVC.viewWillDisappear(true) 
    toVC.viewWillAppear(true) 

    UIView.animateWithDuration(0.3, animations: { 

      //Animations here 

      }, completion: { (success) in 
       toVC.viewDidAppear(success) 
       fromVC.viewDidDisappear(success) 
       transitionContext.completeTransition(true) 
     }) 

} 

ich das nennen „werden“ Methoden, bevor ich tun, Animationen und die „did“ Methoden nach Abschluss