阅读您的评论后,我想知道...如果您的应用程序的结构在逻辑上是选项卡式应用程序结构(实际上您将其称为“选项卡栏应用程序”),您是否应该考虑使用 UITabViewController 而不是导航控制器?毕竟,这就是它的设计目的。
如果您确实使用 TabViewController,您应该重新考虑您对翻转动画的需求,因为这并不能真正使标签页具有 UI 意义。如果您可以放弃翻转动画,TabViewController 可能是一个不错的选择,您至少应该在放弃这个想法之前尝试一下。它还被设计为增长......您可以在标签栏中合并任意数量的标签。查看苹果文档(带图片!)
您会注意到选项卡位于屏幕底部,而您的“选项卡”导航控制器按钮位于屏幕顶部的导航栏中。这也有助于随着您的应用程序的增长,因为它很简单 - 从 UI 设计的角度和以编程方式 - 将 navControllers 作为导航工具合并到各个选项卡中。例如,如果您的地图/列表翻转例程确实对您应用程序的这一部分有意义,您可以将其保留为单个选项卡(在它自己的 navigationController 中)并为应用程序的其他部分添加其他选项卡...
更新
从您的评论中,您说您对 navController-inside-tabBarController 设置感兴趣。在这种情况下,这里有一些方法可以获得翻转过渡并且没有后退按钮..
(1) 模态展示
获得所需内容的最简单方法是设置一个 viewController(比如地图视图)以模态展示另一个(列表视图)。
如果在故事板中:
- 将您的 mapViewController 嵌入到带有导航栏按钮的 navController 中,用于导航到您的图片中的 listView
- 将您的 listViewController 添加到故事板并将其嵌入到它自己的 navContoller 中(而不是 mapViewController 的 navController)。将 barButtonItem 拖到此 navController 并将其连接到 listViewController 中的 IBAction
- 按住 CTRL 键从 mapViewController 的“列表”按钮拖动到 listViewController 以创建一个 segue。选择转场并在属性检查器中将转场类型设置为“模态”,并选中过渡“水平翻转”和“动画”。给它一个名字,以防你想在代码中引用它。
- 在 listViewController 的 IBAction 中添加:
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
那应该达到你的结果。您可以使用完成块将信息从列表视图发送回地图视图,和/或将地图视图设置为列表视图的委托。
如果您不使用情节提要,请查看此苹果指南
从其他视图控制器呈现视图控制器,
尤其是“呈现视图控制器并选择过渡样式”。
这种方法有一个问题——当呈现的视图翻转到屏幕上时,整个先前的视图,包括标签栏,都被翻转到一边。这个想法是,这是一个模式视图,用户需要在应用程序中执行任何其他操作之前关闭它。
(2) 在单个 navController 中推送/弹出 如果这不符合您的意图,您可以使用带有推送和弹出视图的单个 NavigationController 进行导航,并且您可以隐藏后退按钮......但您确实需要保留后退按钮功能,因为您确实想返回mapView,而不是返回新的地图视图。
要隐藏后退按钮,请尝试:
self.navigationItem.hidesBackButton = YES
在最上面的 viewControllers'viewDidLoad
然后,您可以使用这种 IBAction 在 xib/storyboard 中添加 barButtonItem:
[self popViewControllerAnimated:NO]
或者
[self popToRootViewControllerAnimated:NO]
您必须在代码中构建翻转动画,因为它不支持作为 UINavigationController 的内置功能(最好留给读者练习!)
(3) 在单个 viewController 中交换视图 正如 ghettopia 所建议的,您可以在 navController 中使用单个 viewController(或手动放置 navBar)并使用 UIView 类方法交换两个视图
transitionFromView:toView:duration:options:animations:completion
transitionWithView:duration:options:animations:completion
。
这可能是一个很好的简化解决方案,因为您的列表和地图本质上是同一数据模型的两个视图。