【问题标题】:Wait with execution of viewWillDisappear until custom animation has completed?等待执行 viewWillDisappear 直到自定义动画完成?
【发布时间】:2016-09-22 11:03:20
【问题描述】:

我想在用户点击后退按钮以继续返回我的根视图控制器时执行动画。动画只会突出显示用户在详细视图控制器中所做的更改。

我试过这个。动画本身是有效的(对我的问题并不是很重要,只是为了说明我在做什么。)问题是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)         
            })
        }
}

【问题讨论】:

  • 我认为 viewWillDisappear 不适合做这件事。我认为您应该考虑为动画构建另一个功能,并在需要时继续...(动画完成后)
  • @William GP 但我希望动画在用户重新回到根视图控制器时发生。那么,我该怎么做呢?
  • 你的segue目前在哪里?它是如何触发的?
  • @William GP 通过按左上角的后退按钮,我正在从我的详细视图控制器返回到我的根视图控制器。
  • 使用故事板?我会将上面的代码放入该返回按钮的函数中,然后在动画完成后将 prepareForSegue 放在函数的末尾

标签: ios swift animation wait viewwilldisappear


【解决方案1】:

看起来您会想要使用 View Controller Transition API。在高层次上,您需要在视图控制器中实现UINavigationControllerDelegate 协议方法。当您将 View Controller 设置为 Nav Controller 的委托并且即将发生转换时,将调用此方法。在这里,您可以检查并查看交互中涉及哪些 View Controller 以及过渡的方向(Push 或 Pop)。有了这些信息,您就可以提供合适的动画师。

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

“animator”是实现UIViewControllerAnimatedTransitioning 协议的NSObject 子类。这个协议有一些方法来询问转换的时间

- (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]];

}];

}

【讨论】:

  • 谢谢,我试试这个。但是,你确定这能满足我的需要吗?在我回到我的根视图控制器之前,我想在文本字段上执行动画。所以,我并不想在进行转场时对过渡本身进行动画处理。在视图消失之前,只是文本字段上的自定义动画。
  • 我相信您可以通过这种方法实现这一目标。你可以控制过渡时间,所以你知道你可以放慢它直到事情完成并且你可以在动画期间完全控制 ViewController 的位置。通过一些工作,您可以冻结视图控制器的位置,直到所有动画都完成。完成后,您可以在屏幕外为 View Controller 设置动画,并在其上设置新的动画。
  • 谢谢。你有这方面的 Swift 代码吗?我原以为会有一个更简单的解决方案——也许是某种“等待”方法,它会停止 viewWillDisappear 的执行,直到动画完成。
  • 我试过这个,但是当我将 segue 解开回到主视图控制器时,它似乎没有做任何事情。
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多