0

我是 IOS 编程的新手,目前我有一个带有两个选项卡的选项卡栏应用程序。我有两个问题。

第一个选项卡显示了一张地图,用一些图钉想象它。导航栏上有一个按钮,单击此按钮时,我希望地图视图移出并进入列表视图。您可以从图像中看到 UI。该按钮称为列表。

现在,当我单击列表时,我希望此视图消失并进入列表视图。所以这是我的问题?

1)我该怎么做?我尝试了导航模型,但我不想这样做,因为我不想要后退按钮。我尝试制作两个不同的视图,然后将按钮拖到该视图,但应用程序崩溃了。我只想要 nab 栏上的列表按钮,单击时视图更改为列表视图,按钮文本更改为地图。因此,现在如果我再次单击该按钮,它应该返回到地图视图并且该按钮变为列表。

2)我如何实现这个动画?我见过一些页面翻转的应用程序,我也见过一些选项,比如降低不透明度等,但我想实现翻转动画。

感谢您为我提供的任何帮助。对此,我真的非常感激。

4

2 回答 2

1

Interface Builder 可以完成大部分工作。按住控制键并从地图视图控制器的标题为“列表”的 UIBarButtonItem 拖动到列表视图控制器,然后选择 Action Segue“模态”。出现一个代表转场的箭头;单击它并使用属性检查器将转换更改为“水平翻转”。这是一个视频

或者,您可以使用presentViewController:animated:completion以编程方式执行此操作。

现在要从列表中返回地图,我认为必须以编程方式完成。创建一个方法,调用dismissViewControllerAnimated:completion:并让您的列表视图控制器的 UIBarButtonItem 标题为“地图”触发它。

于 2012-12-17T15:28:27.017 回答
0

阅读您的评论后,我想知道...如果您的应用程序的结构在逻辑上是选项卡式应用程序结构(实际上您将其称为“选项卡栏应用程序”),您是否应该考虑使用 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

这可能是一个很好的简化解决方案,因为您的列表和地图本质上是同一数据模型的两个视图。

于 2012-12-17T23:14:27.493 回答