使用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]; }
重要提示 :将这些调用放在viewWillAppear
和viewWillDisappear
而不是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 }
纯故事板解决方案
如果您指的是在推送过渡动画期间出现在标签栏上方的工具栏问题,我可以通过调整故事板中工具栏上的自动布局约束来解决此问题(将其手动添加到视图控制器;请参阅我的另一个答案,如果您使用UITableViewController
或UICollectionViewController
但不能这样做):
添加约束以将底部布局指南的距离设置为零:
双击该约束进行编辑,并将第一个项目设置为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; }
这是演示代码 。
这是结果: