我提到了 this question和几个关于 View / View Controller 转换的问题,但仍然找不到满意的答案。大多数解决方案建议翻转 View 而不是 View Controller 。但是,我的应用程序中的两个 View Controller 具有完全不同的操作和实现逻辑,因此我避免将它们混合在一起。
在我的应用程序中,我有一个模态视图 Controller FrontViewController
,它嵌入在 NavigationController 中。在 View 上按下一个按钮后,模态视图 Controller 应翻转到 BackViewController
,反之亦然。我曾在 FrontViewController
中尝试过以下操作:
let navi = UINavigationController(rootViewController: backController)
navi.modalPresentationStyle = .CurrentContext
navi.modalTransitionStyle = .FlipHorizontal
self.presentViewController(backController, animated: true, completion: nil)
这几乎和我想要的一样,只是它也翻转了导航栏。此外,如果我关闭模态视图,只会关闭堆栈顶部的 View Controller ,而我无法让正确的父/呈现 Controller 关闭模态视图中的所有其他堆栈 Controller 。
因此我进一步尝试阻止 viewcontroller 堆栈并在 FrontViewController
中使用 transitionFromViewController
而使用相同的导航 Controller :
self.navigationController!.addChildViewController(backController)
self.willMoveToParentViewController(nil)
self.navigationController!.transitionFromViewController(self, toViewController: backViewController, duration: 1, options: .TransitionFlipFromLeft, animations: {}, completion: ({Bool -> Void in
self.removeFromParentController()
c.didMoveToParentViewController(self)
}))
然后我在执行时遇到了这个运行时错误:Parent view controller is using legacy containment in call to -[UIViewController transitionFromViewController:toViewController: duration:options:animations:completion:]
那么,如何在两个 View Controller 之间进行转换,同时防止它们保留在 View Controller 堆栈中?
最佳答案
您可以在推送 View Controller 之前向导航 Controller 层添加自定义转换。
let transition = CATransition()
transition.duration = 0.3
transition.type = "flip"
transition.subtype = kCATransitionFromLeft
self.navigationController?.view.layer.addAnimation(transition, forKey: kCATransition)
self.navigationController?.pushViewController(viewController!, animated: false)
请注意,animated
参数应为 false
。否则会出现默认的滑动动画
关于ios - 在同一个 NavigationController 下的两个 ViewController 之间翻转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504313/