取消时交互式过渡怪异闪烁

时间:2016-06-06 18:27:32

标签: ios swift animation uiviewanimationtransition

我正在关注this tutorial以了解如何为UIViewControllers进行交互式转换。

一切正常,但我发现了一些闪烁。

当您从右向左拖动屏幕时,我发现了第一个闪烁。这是因为平移手势将识别每次拖动并运行panned(_:)方法,并将弹出或执行segue来更改控制器。我修复了id添加委托方法gestureRecognizerShouldBegin(_:)

这确保了如果从右向左拖动,则手势永远不会开始(.Begin)。

但现在我有一个不同的问题。如果我从左向右拖动(按预期)但不中断拖动,则从右向左改变方向,应取消转换。在这种情况下,我可以在再次出现旧控制器之前看到新控制器的短暂闪烁。

如何优雅地取消交互式动画?

This is a video试图表明问题。我找不到减慢这个动画速度的方法,所以它非常快。

修改

我尝试了两种不同的方法。

This one使用CABasicAnimation为转换设置动画。 And this one使用animateWithDuration(_:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)

每当我拨打cancelInteractiveTransition

时,它们都会闪烁

1 个答案:

答案 0 :(得分:0)

这是我解决问题的方法:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
[UIView animateWithDuration:[self transitionDuration:transitionContext]
                      delay:self.interactive?[self transitionDuration:transitionContext]:0 //  If zero, the animation briefly flashes in iOS 11.
                    options:option
                 animations:^{
                 } completion:^(BOOL finished) {
                 }];
}
  

最重要的是交互式过渡中的延迟动画

请参见下面的代码:我发现如果我们在dismissViewControllerAnimated:YES中调用UIGestureRecognizerStateBegan,如果不延迟动画,动画将立即开始。然后,在UIGestureRecognizerStateChanged中,updateInteractiveTransition:progress将将视图移至“前进位置”。似乎是一刹那

 switch (sender.state) {
    case UIGestureRecognizerStateBegan:
        _interactive = YES;
        [viewcontroller dismissViewControllerAnimated:YES completion:nil];
        break;
    case UIGestureRecognizerStateChanged:
        [self updateInteractiveTransition:progress];
        break;
    case UIGestureRecognizerStateEnded:
    {
        _interactive = NO;
        if (shouleFinish) {
            [self finishInteractiveTransition];
        } else {
            [self cancelInteractiveTransition];
        }
    }
        break;
    case UIGestureRecognizerStateCancelled:
        _interactive = NO;
        [self cancelInteractiveTransition];
        break;
    default:
        break;