2016-07-20 2 views
1

Я хочу представить контроллер вида с помощью пользовательских переходов. В то же время, я хочу убедиться, что когда он будет уволен, за ним заведует диспетчер представлений, который находится на переднем плане.Trigger viewWillAppear при использовании делегата с переходом

Моя основная идея - попробовать несколько разных конфигураций и посмотреть, какой из них приведет к выходу viewWillAppear на контроллер вида.

Покушение 1

presentedViewController.modalPresentationStyle = .Custom 
presentedViewController.transitioningDelegate = someTransitioningDelegate 

Это подход по умолчанию, а пользовательский переход отлично работает нормально, но я хочу viewWillAppear называться на контроллере представления за presentedViewController, когда я называю presentedViewController.dismissViewControllerAnimated(true) (который не делает бывает). Так что я сделал это:

Покушение 2

presentedViewController.modalPresentationStyle = .FullScreen 
presentedViewController.transitioningDelegate = someTransitioningDelegate 

или

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

Теперь viewWillAppear вызывается на контроллере представления позади presentedViewController при отклонении presentedViewController, и происходит переход, как ожидается, когда представляя контроллер вида.

Однако, когда отклоняя контроллер представления, фон во время перехода черный; кажется, что .FullScreen заставляет диспетчеры представлений за presentedViewController быть удалены из иерархии представлений - это хорошо, потому что предположительно это то, что вызывает вызов viewWillAppear.

Покушение 3

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

Интересно, что если .CoverVertical указано, но transitioningDelegate нет, то фон во время перехода на самом деле находится контроллер вид сзади presentedViewController, но viewWillAppear вызывается на контроллер просмотра позади presentedViewController в любом случае. Единственное, чего не хватает, - это настраиваемый переход.


Проект Я работаю на структурирована таким образом, что делает его трудно использовать делегирование (который, кажется, предложенный ответ here).Используя NSNotificationCenter еще одна альтернатива, которая позволяет мне назвать код, который должен быть вызван viewWillAppear, но от попытки 3, я надеюсь, что есть более элегантный подход к достижению всех этих:

  1. Trigger viewWillAppear
  2. Используйте выборочный переход
  3. См-контроллер был представлен в фоновом режиме во время перехода анимации

ответ

3

Кажется Apple, считает это нечестная игра для вызова viewWillAppear и т.д., но это нормально для использования beginAppearanceTransition и endAppearanceTransition, which in turn will invoke viewWillAppear. Я пойду с этим.

0

путь я достиг этого в прошлом, позвонив по телефону viewWillAppear и соперничают wDidAppear от аниматора перехода. Вот упрощенный пример:

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

} 

я называю «будет» методы, прежде чем я анимации, и «сделал» методы после завершения

Смежные вопросы