使用hidesBottomBarWhenPushed在推送动画期间工具栏定位错误

我有一个应用程序使用Tabbar进行基本导航。 从Tabbar的一个屏幕我想要输入另一个显示工具栏而不是Tabbar和顶部的后退导航项目。

做这个的最好方式是什么? 如果我使用“在推送时隐藏底栏”(又名hidesBottomBarWhenPushed)并在屏幕上添加工具栏,我可以看到在工具栏放置在屏幕底部之前删除Tabbar的动画。

带工具栏的UITableViewController解决方案(需要代码)

使用此答案中的代码,我能够实现相同的效果,但工具栏位于表格视图的底部。

将其添加到表视图控制器:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setToolbarHidden:NO animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setToolbarHidden:YES animated:YES]; } 

重要提示 :将这些调用放在viewWillAppearviewWillDisappear而不是viewDidLoad会使这更容易处理,因为它可以可靠地工作,即使对于同一个视图控制器的多次推送和弹出,您也不必在之前清理它查看控制器。

并在故事板中配置如下:

此外,在故事板或代码中按下时 ,启用隐藏底栏 ,以便按下视图控制器。

然后,您可以将工具栏按钮添加到故事板中的工具栏。

构建并运行,你会得到这样的效果:

在此处输入图像描述

这是一个完整的示例项目,展示了这一点 。

问题示例

在此处输入图像描述

这是我的解决方案,

在具有tabbar第一个视图控制器中执行此操作

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "someSegue" { if let secondVC = segue.destinationViewController as? InfoTableViewController { secondVC.hidesBottomBarWhenPushed = true } } } 

我也需要这个,因为我的工具栏会出现在第一个VC中。

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) navigationController?.toolbarHidden = true } 

要停止工具栏的淡化动画,所以它就在那里我在第二个VC中使用了它

 override func viewDidLoad() { super.viewDidLoad() navigationController?.toolbarHidden = false } 

纯故事板解决方案

如果您指的是在推送过渡动画期间出现在标签栏上方的工具栏问题,我可以通过调整故事板中工具栏上的自动布局约束来解决此问题(将其手动添加到视图控制器;请参阅我的另一个答案,如果您使用UITableViewControllerUICollectionViewController但不能这样做):

添加约束以将底部布局指南的距离设置为零:

双击该约束进行编辑,并将第一个项目设置为Bottom (默认情况下它将为Top )。

全做完了! 这将产生如下效果:

这是我的示例项目 ,演示了如何按预期工作。 请注意,我没有更改任何代码,一切都在故事板中。

从Xcode 7开始,纯Storyboard解决方案不再起作用,因为Xcode不允许您将Bottom属性分配给Bottom Layout Guide。

对于我的项目,我使用了以下设置:

  • 一个UITabBarController作为初始视图控制器,进入一个
  • UINavigationController ,root vc设置为…
  • UIRegularViewController ,它应该正常运行,但会产生一个……
  • UISpecialViewController ,它应隐藏标签栏,而是显示工具栏。 此外,它应该隐藏状态栏,导航栏和工具栏。

以下是我为实现这一目标所做的工作:

在故事板中

UITabBarController :将Tab Bar Translucency设置为NO

UISpecialViewController :像这样设置模拟指标

  • 状态栏:无
  • 顶栏:不透明的Nav Bar
  • 底栏:不透明工具栏

像这样设置扩展边缘

  • 在顶栏下:没有
  • 在底栏下:是
  • 在不透明的酒吧下:是的

不要将UIToolBar拖入UISpecialViewController

在实施中

 // in UISpecialViewController.m - (void)viewWillAppear:(BOOL)animated { self.navigationController.toolbarHidden = NO; self.navigationController.hidesBarsOnTap = YES; } - (void)viewWillDisappear:(BOOL)animated { self.navigationController.toolbarHidden = YES; self.navigationController.hidesBarsOnTap = NO; } - (BOOL)prefersStatusBarHidden { return self.navigationController.navigationBarHidden; } 

这是演示代码 。

这是结果:

在此处输入图像描述