Swift-视图控制器之间的动画前进和后退

时间:2019-03-15 00:30:49

标签: swift animation uiview uiviewcontroller segue

我正在使用Swift 4.0设计一个ios应用程序。我目前有两个视图控制器,其中有一个UIView波浪图像,宽1606宽,高628:

Waves Picture

在第一个视图控制器中,波形像这样位于屏幕底部:

Initial Position

向上滑动时,我将通过segue传递以下数据:

let waveHeight = hundred?.layer.presentation()?.position.y // Current height of waves. This is a global variable

let nextViewController = segue.destination as! Secondary // nextViewController is the segue destination

nextViewController.initialXPosition = nextXPosition // this will be the initial state of the waves in the secondary view controller. Also a global variable

为了进行无缝过渡,我需要在辅助视图控制器中的波形刚好在初始视图控制器中停止的地方开始。产品看起来像这样:

https://giphy.com/gifs/2A4bUGE9UFUrG9RHPG

继续前进,当我向上滑动时,波浪需要相应地向上传播(100个单位)。为此,我使用了以下方法:

UIView.animate(withDuration: 1, delay: 0, options: [.curveLinear], animations: {
        self.hundred.transform = CGAffineTransform(translationX: 0, y: -100)

        self.waveHeight = self.hundred?.layer.presentation()?.position.y
    }, completion: nil) 

这时,海浪在屏幕上顺畅移动,并向上扫了100个单位。

完美。

现在向下滑动是发生问题的地方。我只想使用相同的方法平稳地返回到初始屏幕。存储当前的波高,将其通过segue返回给初始视图控制器,并使波向下平移100个单位。

这不起作用。

由于某种原因,我无法将波的y位置存储在第二个视图控制器中。我已经设置了打印语句,无论向下滑动时动画在哪里,控制台每次都会返回相同的值。因此,当我返回到初始视图控制器时,波浪会自动前进到屏幕底部。真是断断续续。

是否有更好的方法在视图控制器之间来回传递动画?

2 个答案:

答案 0 :(得分:0)

与其试图在两个视图控制器之间来回传递动画状态,不如两个视图控制器都引用一个单独的对象来控制单个动画状态。

答案 1 :(得分:0)

  

是否有更好的方法在视图控制器之间来回传递动画?

。创建您自己的UIStoryboardSegue子类,并实现perform()方法来运行动画。 segue可以访问源视图控制器和目标视图控制器,因此它是一个对象,既可以将源控制器的视图动画显示在屏幕之外,也可以将目标控制器的视图动画显示在屏幕上。在一个地方制作所有动画意味着您完全不必“来回传递动画”。