在导航控制器委托可以实现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()
}
)
}