Ios 在UIViewController之间转换时保持UI元素在适当的位置

Ios 在UIViewController之间转换时保持UI元素在适当的位置,ios,uiviewcontroller,Ios,Uiviewcontroller,我想知道在UIViewController之间前进/后退时,保持某些UI元素的最佳实践是什么,例如,如果我使用UINavigationController 具体来说。我正在制作一个具有多个类似视图控制器的应用程序(它们可以是一个主视图控制器的实例)。然后用户点击下一步按钮进入下一页;或者滑回上一页。我在顶部有一个进度条,在底部有一个或多个按钮,我希望在其他内容随着动画变化时保持静态(一个简单的按钮可能会起作用)。 现在我的问题是,是否最好将内容放在容器视图中?或者实现自定义转换以在移动其余项目时

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

具体来说。我正在制作一个具有多个类似视图控制器的应用程序(它们可以是一个主视图控制器的实例)。然后用户点击下一步按钮进入下一页;或者滑回上一页。我在顶部有一个进度条,在底部有一个或多个按钮,我希望在其他内容随着动画变化时保持静态(一个简单的按钮可能会起作用)。 现在我的问题是,是否最好将内容放在容器视图中?或者实现自定义转换以在移动其余项目时保持这些项目的位置

以下是该概念的图像:


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

如果您想保持UINavigationController的基本动画,并保持元素稳定,您可以选择另一条路线。在视图控制器中,实现
视图将出现:
和/或
视图将消失:
。在那里,您可以获得
transitionocordinator
并调用
animate(连同transition:,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()
     }
  )
}