在UIViewControllers之间过渡时保持UI元素位置不变

3
我想知道在使用UINavigationController时,保持某些UI元素不变的最佳实践是什么。

具体来说,我正在制作一个应用程序,其中有几个类似的视图控制器(它们可以是一个主视图控制器的实例)。然后用户点击下一页按钮进入下一页;或向后滑动以返回上一页。我在顶部有一个进度条,底部有一个或多个按钮,我希望在其余内容通过动画更改时将其保持静态不变(简单的推送可能有效)。 现在我的问题是,将内容放在容器视图中是否更好?还是实现自定义转换,使那些项目保持不变,同时移动其余部分?

以下是该概念的图像:

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

1个回答

4
在导航控制器委托中,您可以实现 navigationController(_ navigationController:, animationControllerFor:, from:, to:) 来返回一个自定义的 UIViewControllerAnimatedTransitioning 对象。如果您选择这种方法,则必须完全自己实现整个动画。
如果您想保留 UINavigationController 的基本动画并使您的元素保持稳定,则可以选择另一种方法。在您的视图控制器中实现 viewWillAppear: 和/或 viewWillDisappear:。在其中您可以获取 transitionCoordinator 并在其上调用 animate(alongsideTransition:, completion:)。通过这种方式,您可以将自定义动画与系统提供的动画并行运行。
为了保持固定元素,您需要向容器视图添加另一个副本,并且可以从传递给您的 block 的上下文对象中获取它。在完成块中,您可以将其删除。
听起来很复杂,但如果您查看代码,它实际上相当简单:
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()
     }
  )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接