使用UIPercentDrivenInteractiveTransition更改animateTransition中动画的值

时间:2017-03-27 00:07:18

标签: ios swift animation transition

我正在尝试向上/向下滑动以关闭视图控制器,一切都运行良好。如果我开始向上滑动,它将向上完成动画,反之亦然。

当用户第一次向上滑动然后决定向下滑动视图控制器时出现问题 - 如何更改动画中的值以将视图控制器关闭到底部而不是顶部(由用户设置&#39) ;先刷卡)。

在我的UIViewControllerAnimatedTransitioning控制器中,我定义了这样的动画:

func animateTransition(transitionContext:UIViewControllerContextTransitioning) {
        UIView.animateWithDuration(duration, animations: {
                guard let transitionDelegate = self.transitionDelegate else {return}
                snapshot.frame.origin.y = transitionDelegate.shouldAnimateUp ? -snapshot.frame.height : snapshot.frame.height

TransitionDelegate指向UIPercentDrivenInteractiveTransition控制器(定义了滑动手势)。 ShouldAnimateUp在UIPanGestureRecognizer函数中定义如下:

shouldAnimateUp = translatedView.center.y < translatedView.frame.height / 2

即如果视图位于上半部分shouldAnimateUp = true,反之亦然。 但不幸的是,当我调用finishInteractiveTransition() func时,它会在调用UIView.animateWithDuration时使用UIViewControllerAnimatedTransitioning控制器中dismissViewControllerAnimated(true, completion: nil)中最初设置的值。

那么,有没有办法在调用 dismissViewControllerAnimated(true, completion: nil)之后更改UIViewControllerAnimatedTransitioning控制器中的动画值?

PS:我有点难以用文字来定义我的问题(单词很难),所以请告诉我你是否需要额外的信息,或者我是否应该尝试重写我的解释。另外,还有一个提示:我希望动画像官方Twitter应用程序中的图像解雇一样工作。

1 个答案:

答案 0 :(得分:2)

好的,我明白了他们在做什么。它实际上更复杂了#34;如果你向下滑动然后向上滑动,它会向上移动场景并且#34;。如果你向下滑动并备份,如果你没有超过你开始的地方,Twitter应用程序将取消,但如果你经过了相当大的一部分(并且仍在向上滑动),那么它将会上升。

我必须承认,我并不为这个用户体验而疯狂,因为两个非常相似的手势会导致非常不同的行为。如果向下滑动,保持手指向下,然后向上轻弹,有一种看似随意的性质,即它是否被解释为向下滑动的取消或向上滑动。我个人认为,如果用户发起一个可证明的向下手势,那么拖延回来应该只是取消过渡。但这不是问题所在。

无论如何,如果这是你想要做的,有几种方法可以实现它:

  1. 您可以考虑使用基于视图属性动画制作器的动画,它比旧动画技术更优雅地处理动画的中途变化。所以,理论上你可以只addAnimations到你的UIViewPropertyAnimator。但这对我来说似乎很混乱。

    有关视图属性动画师以及如何将其与可中断的自定义转换结合使用的详细信息,请参阅Advances in UIKit Animations and Transitions

  2. 解雇时,您可能根本不使用UIViewControllerAnimatedTransitioning。只是自己动手解雇。

    例如,当您呈现时,UIPresentationController子类可以保留呈现视图(通过从should​Remove​Presenters​View返回false)。然后,当手势识别器启动时,它可能根本不会启动dismiss的自定义交互式自定义转换,而只是调整呈现场景的frame(并修改调光铬的不透明度) )。然后,在手势结束时,手动完成动画,然后completion块可以忽略所呈现的视图控制器而根本没有动画(因为您自己动画了它)。

    恕我直言,这在建筑上是不优雅的。视图控制器没有任何与应该由演示控制器拥有的chrome有关的业务。但是,它有效。

  3. 我们应该认识到他们可能没有&#34;呈现&#34;全屏图像。例如,他们可以完成简单的视图控制器包含,但只是将子视图控制器场景添加到现有场景中。然后,手势可以执行任何frame和调整图层不透明度所需的更改,当完成时,只需执行最终动画,在完成块中,只需删除子视图控制器(例如willMoveremoveFromParentViewController)。

  4. 如果我这样做,我可能会倾向于选项3,尽管我已经投入时间,但是你已经投入时间进行自定义交互式转换,这可能不会令你感到非常满意。无论如何,这些都是您可以考虑的几种方法。