确定 unwind segue 动画何时完成

Posted

技术标签:

【中文标题】确定 unwind segue 动画何时完成【英文标题】:Determine when unwind segue animation is completed 【发布时间】:2017-07-19 23:38:55 【问题描述】:

我有一个使用 UIPercentDrivenInteractiveTransitionUIViewControllerAnimatedTransitioning 的自定义关闭动画。它是由一个 unwind segue 启动的,并且在 prepareForSegue: 中设置了转换委托。

在我呈现的视图控制器中,一旦我开始 segue,而不是在 segue 完成时,unwind IBAction 就会不断被调用。这是有问题的,因为我的关闭动画是手势驱动的,所以我们不知道需要多长时间才能完成。

有没有办法知道 segue 何时完成动画?

viewWillAppear:viewDidAppear: 在完成的那一刻似乎都没有被调用,我认为这是因为 segue 是展开的 segue。

【问题讨论】:

【参考方案1】:

完成后捕捉动画,您可以使用它。

- (void)perform 
      [CATransaction begin];
        [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
      [CATransaction setCompletionBlock:^
            //whatever you want to do after the animation
      ];
      [CATransaction commit];
    

【讨论】:

【参考方案2】:

这在 UIStoryboardSegue.h 中有解释:

/// Subclasses can override this method to augment or replace the effect of this segue. For example, to animate alongside the effect of a Modal Presentation segue, an override of this method can call super, then send -animateAlongsideTransition:completion: to the transitionCoordinator of the destinationViewController.
/// The segue runtime will call +[UIView setAnimationsAreEnabled:] prior to invoking this method, based on the value of the Animates checkbox in the Properties Inspector for the segue.
- (void)perform;

例如

- (void)perform

    [self.destinationViewController.transitionCoordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) 

     completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) 
        // unwind segue animation has completed
    ];

    [super perform];


【讨论】:

以上是关于确定 unwind segue 动画何时完成的主要内容,如果未能解决你的问题,请参考以下文章

unwind segue vs. popViewController 动画

如何可靠地确定 UICollectionView 布局何时完成动画

从 UINavigationController 中删除动画推送展开?

iOS - 如何在 Unwind Segue 中控制动画类型?

swift 4 - segue 动画完成后如何在目标视图控制器中运行代码?

观察 UIViewPropertyAnimator 正在运行问题