iOS编程视图之间的交换/转换

时间:2012-12-17 14:12:32

标签: ios uiviewcontroller uinavigationcontroller uiviewanimationtransition

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

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

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

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

2)我如何实现动画?我看过一些应用程序,页面翻转,我已经看到一些选项,如减少不透明度等,但我想实现翻转动画。

感谢您的帮助。我真的很感激。

2 个答案:

答案 0 :(得分:1)

Interface Builder可以完成大部分工作。按住控制键并从地图View Controller的标题为“List”的UIBarButtonItem拖动到列表View Controller,然后选择Action Segue“modal”。出现一个代表segue的箭头;单击它并使用属性检查器将过渡更改为“水平翻转”。 Here's a video

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

现在从列表中回到地图,我相信必须以编程方式完成。创建一个调用dismissViewControllerAnimated:completion:的方法并使列表View Controller的UIBarButtonItem标题为“Map”触发它。

答案 1 :(得分:0)

阅读完你的评论后,我想知道...如果您的应用程序的结构在逻辑上是一个标签式应用程序结构(实际上您将其称为“标签栏应用程序”),您不应该考虑使用UITabViewController而不是NavigationController?毕竟,这就是它的目的。

如果你使用TabViewController,你应该重新考虑你对翻转动画的渴望,因为它并没有真正使用标签的UI感觉。如果你可以省去翻转动画,TabViewController可能是一个很好的方法,你应该至少在解开这个想法之前尝试一下。它还旨在增长...您可以在选项卡栏中包含任意数量的选项卡。 Check out the apple docs (with pictures!)

您会注意到标签位于屏幕的底部,而“标签”navController按钮位于屏幕顶部的导航栏中。这也有助于您的应用程序增长,因为它很简单 - 从UI设计的角度和编程方式 - 将navControllers作为导航工具整合到各个选项卡中。例如,如果您的地图/列表翻转例程对您的应用程序的部分确实有意义,您可以将其保留为单个选项卡(在其自己的navigationController中)并为其他部分添加其他选项卡应用...

<强>更新
从您的评论中,您说您对navController-inside-tabBarController设置感兴趣。在这种情况下,这里有一些方法来获得翻转过渡而没有后退按钮..

(1)模态演示 获得所需内容的最简单方法是设置一个viewControllers(比如地图视图)以模态方式呈现另一个(列表视图)。

如果在故事板中:

  • 使用导航栏按钮将mapViewController嵌入到navController中,以便按照图片导航到listView
  • 将listViewController添加到故事板并将其嵌入到自己的navContoller(而不是mapViewController的navController)中。将barButtonItem拖到此navController并将其连接到listViewController中的IBAction
  • CTRL-从mapViewController的'list'按钮拖动到listViewController以创建segue。选择segue并在属性检查器中将segue类型设置为'modal',并选中转换'flips horizo​​ntal'和'animated'。如果你想在代码中引用它,请给它一个名字。
  • listViewController的IBAction中的
  • 添加这个:
    [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];

那应该达到你的结果。您可以使用完成块将信息从列表视图发送回地图视图,和/或将地图视图设置为listView的委托。

如果您没有使用故事板,请查看此苹果指南

Presenting View Controllers from Other View Controllers
特别是“呈现视图控制器并选择过渡风格”。

这种方法有一个问题 - 当呈现的视图翻转到屏幕上时,整个先前的视图(包括标签栏)都会被移开。我们的想法是,这是一个模态视图,用户需要在应用程序中执行任何其他操作之前将其解除。

(2)在单个navController中推送/弹出如果这不符合您的意图,您可以使用单个NavigationController进行导航,同时推送和弹出视图,以及你可以隐藏后退按钮...但你确实需要保留后退按钮的功能,因为你想返回到mapView,而不是到新的地图视图。

要隐藏后退按钮,请尝试:

        self.navigationItem.hidesBackButton = YES

位于最上面的viewControllers'viewDidLoad

然后你可以在xib / storyboard中添加一个barButtonItem,使用这种IBAction:

[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

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