2016-05-25 3 views
0

Я хотел бы выполнить анимацию, когда пользователь нажимает кнопку «Назад», чтобы вернуться к моему контроллеру Root View. Анимация просто выделит изменения, которые пользователь внес в контроллер подробного представления.Подождите с выполнением viewWillDisappear, пока пользовательская анимация не завершится?

Я пробовал это. Сама анимация работает (и не очень важна для моего вопроса, просто оставила ее, чтобы проиллюстрировать, что я делаю.) Проблема в том, что segueing происходит слишком быстро, и вы не можете видеть анимацию.

Как я могу wait с выполнением viewWillDisappear до завершения анимации?

override func viewWillDisappear(animated: Bool) { 
     // ... 

     // Animate if text changes. reminderAfterRulesRun is a custom data structure. reminderNameTextInput is my outlet to my label 
     if reminderNameTextInput.text != reminderAfterRulesRun.title { 

      let originalreminderNameTextInputColor = self.reminderNameTextInput.textColor 

      // Animate the removing of "All" and replacing it with the most commonly used list. 
      UIView.animateWithDuration(0.3, delay: 0, options: .Autoreverse, animations: { 

       // Fade out 
       self.reminderNameTextInput.textColor = UIColor.redColor() 
       self.reminderNameTextInput.text = reminderAfterRulesRun.title 
       self.reminderNameTextInput.alpha = 0.0 

       }, completion: { 
        (finished: Bool) -> Void in 

        // Once the label is completely invisible, set the text and fade it back in 
        UIView.animateWithDuration(0.3, delay: 0, options: .Autoreverse, animations: { 
         //      self.reminderNameTextInput.selectedSegmentIndex = self.toSegmentedControlValue(reminderAfterRulesRun.reminderNameTextInput)! 
         self.reminderNameTextInput.text = reminderAfterRulesRun.title 
         self.reminderNameTextInput.textColor = originalreminderNameTextInputColor 
         self.reminderNameTextInput.alpha = 1.0 
         }, completion: nil)   
      }) 
     } 
} 
+0

Я не думаю, что viewWillDisappear является правильным местом, чтобы сделать это. Я думаю, вам стоит подумать о создании еще одной функции для анимации и перейдите, когда захотите. (После окончания анимации) –

+0

@William GP Но я хотел бы, чтобы анимация произошла, когда пользователь перешел к контроллеру корневого представления. Итак, как мне это сделать? – Daniel

+0

Где сейчас находится ваш segue? Как это срабатывает? –

ответ

1

Похоже, вы захотите использовать API перехода контроллера View. На высоком уровне вам необходимо будет реализовать методы протокола UINavigationControllerDelegate в вашем контроллере просмотра. Когда вы устанавливаете View Viewer в качестве делегата вашего Nav Controller и произойдет переход, этот метод вызывается. Здесь вы можете проверить и посмотреть, какие элементы View Controllers задействованы во взаимодействии и в каком направлении происходит переход (Push или Pop). С помощью этой информации вы можете предоставить соответствующий аниматор.

- (id<UIViewControllerAnimatedTransitioning>) 
       navigationController:(UINavigationController *)navigationController 
    animationControllerForOperation:(UINavigationControllerOperation)operation 
       fromViewController:(UIViewController*)fromVC 
        toViewController:(UIViewController*)toVC 
{ 
if (operation == UINavigationControllerOperationPush) { 
    return self.animator; 
} 
    return nil; 
} 

"аниматора" является NSObject подкласс, который реализует протокол UIViewControllerAnimatedTransitioning. Этот протокол содержит методы, которые просят на время перехода

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{ 
    return 0.25; 
} 

, а затем вызова для осуществления перехода:

- (void)animateTransition: (id<UIViewControllerContextTransitioning>)transitionContext 
{ 
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
[[transitionContext containerView] addSubview:toViewController.view]; 
toViewController.view.alpha = 0; 

[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{ 
    fromViewController.view.transform = CGAffineTransformMakeScale(0.1, 0.1); 
    toViewController.view.alpha = 1; 
} completion:^(BOOL finished) { 
    fromViewController.view.transform = CGAffineTransformIdentity; 
    [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 

}]; 

} 
+0

Спасибо, я попробую это. Однако вы уверены, что это делает то, что мне нужно? Я хотел бы выполнить анимацию в текстовом поле, прежде чем переходить к контроллеру корневого представления. Таким образом, я не пытаюсь оживить сам переход, выполняя сегу. Просто пользовательская анимация в текстовом поле ДО ТОГО, как вид исчезает. – Daniel

+0

Я считаю, что вы можете добиться этого с помощью этого подхода. У вас будет контроль над временем перехода, чтобы вы знали, что можете замедлить его, пока все не будет выполнено, и вы полностью контролируете положение ViewController во время анимации. С небольшим количеством работы вы можете заморозить позицию контроллера просмотра до тех пор, пока все ваши анимации не будут выполнены. Как только они будут выполнены, вы анимируете экранный монитор View Viewer и анимируете новый. –

+0

Спасибо. У вас есть код Swift для этого? Я бы подумал, что будет более простое решение - возможно, какой-то метод ожидания, который остановит выполнение viewWillDisappear до завершения анимации. – Daniel