2015-09-17 36 views
3

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

具体说明。我正在制作一个具有多个类似视图控制器的应用程序(它们可以是一个主视图控制器的实例)。然后用户点击下一个按钮进入下一页;或向后滑动以转到上一页。我在顶部有一个进度条,底部有一个或多个按钮,我希望保持静态,而其余内容正在使用动画进行更改(可能需要简单的推送)。 现在我的问题是,如果最好将内容放在容器视图内?或实施自定义过渡以保持这些物品到位,同时移动剩余物品?

这里是概念的图像:

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

回答

2

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