在UIViewControllers之间转换时保持UI元素的位置

时间:2015-09-17 16:44:00

标签: ios uiviewcontroller

我想知道在UIViewController之间前进/后退时保留一些UI元素的最佳做法是什么,例如,如果我使用的是UINavigationController

具体而言。我正在制作一个有几个类似视图控制器的应用程序(它们可以是一个主视图控制器的实例)。然后用户点击下一个按钮进入下一页;或者向后滑动以转到上一页。我在顶部有一个进度条,在底部有一个或多个按钮,我希望保持静态到位,而其余的内容随动画一起变化(简单推送可能有效)。 现在我的问题是,如果将内容更好地放在容器视图中?或者实现自定义过渡以在移动其余部分时保留这些项目?

以下是概念图:

www.dropbox.com/s/izavmhbkihkiyiy/question.png?dl=0

1 个答案:

答案 0 :(得分:4)

在导航控制器委托中,您可以实现navigationController(_ navigationController:, animationControllerFor:, from:, to:)以返回自定义UIViewControllerAnimatedTransitioning对象。如果你走这条路线,你必须自己实现整个动画。

如果你想保留UINavigationController的基本动画,只是保持你的元素稳定,你可以走另一条路。在视图控制器实现viewWillAppear:和/或viewWillDisappear:中。在那里,您可以获得transitionCoordinator并在其上调用animate(alongsideTransition:, completion:)。有了它,您可以与系统提供的动画并行运行自定义动画。

要保留固定元素,可以将固定元素的另一个副本添加到容器视图中,您可以从传递给块的上下文对象中获取。在完成块中,您可以再次删除它。

听起来很复杂,但如果你看一下代码,它实际上很容易:

override func viewWillDisappear(animated: Bool) {
  super.viewWillDisappear(animated)

  let fixedViewCopy = UIView(...) 
  fixedViewCopy.frame = self.fixedView.frame

  transitionCoordinator?.animate(
     alongsideTransition: { context in
       context.containerView.addSubview(fixedViewCopy)
     },
     completion: { _ in
       fixedViewCopy.removeFromSuperview()
     }
  )
}