ios - 在同一个 NavigationController 下的两个 ViewController 之间翻转

标签 ios swift uiviewcontroller uinavigationcontroller uiviewanimationtransition

我提到了 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/

相关文章:

ios - 如何制作自定义 TableView ,其中如果行是一个 TableView 也显示为一行表

iphone - 为什么加载 View Controller 时没有调用我的 initWithNib 方法?

c# - Xamarin IOS 在 xamarin 上导航到另一个没有按钮的 View Controller

ios - 表格单元格中的自动行高

ios - 将数据从 UIViewController1 传递到 UIViewController2 时 UIViewController2 的背景颜色消失

ios - 如何获取索引路径?

ios - 从 Objective-C 访问 Swift 扩展

ios - 使用 exit-segue 时的 viewWillAppear 和 viewDidAppear

ios - ScrollView 不工作 iOS Swift

ios - View Controller 在 Swift 中调用 unwind segue 时卡住