我想知道在UIViewController
之间前进/后退时保留一些UI元素的最佳做法是什么,例如,如果我使用的是UINavigationController
。
具体而言。我正在制作一个有几个类似视图控制器的应用程序(它们可以是一个主视图控制器的实例)。然后用户点击下一个按钮进入下一页;或者向后滑动以转到上一页。我在顶部有一个进度条,在底部有一个或多个按钮,我希望保持静态到位,而其余的内容随动画一起变化(简单推送可能有效)。 现在我的问题是,如果将内容更好地放在容器视图中?或者实现自定义过渡以在移动其余部分时保留这些项目?
以下是概念图:
答案 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()
}
)
}