带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController
Posted
技术标签:
【中文标题】带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController 工具栏,而不是 UITabBarController 选项卡栏【英文标题】:UITabBarController with UINavigationController, hide UINavigationController toolbar on hidesBottomBarWhenPushed, not UITabBarController tab bar 【发布时间】:2012-01-13 05:06:16 【问题描述】:我有一个带有三个视图控制器的UITabBarController
根视图控制器,其中一个是UINavigationController
,其中一个UIViewController
包含一个UISearchDisplayController
和一个UITableView
。 UINavigationController
工具栏未隐藏。
但是,当我在UITableView
中选择一行时,我想推送另一个UIViewController
。按下此 UIViewController
时,UINavigationController
工具栏应滑出,UITabBarController
标签栏应保持可见。
我尝试将推送的UIViewController
的 hidesBottomBarWhenPushed 属性设置为 true(当UINavigationController
未嵌套在UITabBarController
中时,它提供了预期的行为)。不幸的是,当 hidesBottomBarWhenPushed 设置为 true 时,UITabBarController
滑出,UINavigationController
在被推送的UIViewController
中作为底部栏可见,而不是将 UINavigationController
工具栏滑出。
如何在按下时滑出UINavigationController
工具栏,而不是UITabBarController
标签栏?
编辑 #1:
我能想到的唯一可能的解决方案是,而不是使用UINavigationController
工具栏,只需将UIToolbar
添加到包含UITableView
的UIViewController
视图的底部。这将确保UIToolbar
在新的UIViewController
被推入时滑出,而在新的UIViewController
被弹出时滑入。唯一的问题是,对于 iPhone 和 iPod Touch,与UINavigationController
工具栏不同,UIToolbar
实例的高度(44 像素)不会缩小到 30+ 像素(就像UINavigationController
工具栏一样)设备旋转到横向。如果这是唯一合法的解决方案,我该如何更改UIToolbar
的高度以匹配横向中UINavigationController
工具栏的高度?
编辑#2:
关于 EDIT #1,我想 UIToolbar
的框架可以在 willRotateToInterfaceOrientation
方法中更改。不过,我仍然想找到一个滑出UINavigationController
工具栏的解决方案。比为每个UIViewController
创建一个单独的UIToolbar
更好,我希望有一个底部工具栏。
编辑#3: 基本上,这就是我所拥有的(这是 hidesBottomBarWhenPushed 的结果):http://flic.kr/p/bcjydn
而且,这是我想要实现的目标:http://flic.kr/p/bcjybK
编辑#4: 首先,感谢您的宝贵时间。其次,不幸的是,UINavigationController 中的 setToolbarHidden:animated: 方法无法产生动画中的滑出/滑动,如 setHidesBottomBarWhenPushed 所示:(请参阅 EDIT #3 中的链接,特别是第二个链接,为所需的动画)。例如,假设我们写:
- (void)viewWillAppear:(BOOL)animated
[self.navigationController setToolbarHidden:NO animated:NO];
[super viewWillAppear:animated];
在父视图控制器(工具栏没有隐藏的视图控制器)中,假设我们写:
- (void)viewWillAppear:(BOOL)animated
[self.navigationController setToolbarHidden:YES animated:NO];
[super viewWillAppear:animated];
在子视图控制器(隐藏工具栏的视图控制器)中。
只要我们将子视图控制器从父视图控制器推送到 UINavigationController 堆栈,就会调用子视图控制器 viewWillAppear: 方法。这将简单地隐藏 UINavigationController 工具栏(在推送动画开始之前),暴露位于 UINavigationController 工具栏下方的 UIWindow 部分。推送动画的其余部分按预期执行(UINavigationController 工具栏在子视图控制器中仍然不可见,所有内容都已适当调整大小)。然后,当我们弹出子视图控制器时,会为 parentViewController 调用 viewWillAppear: 方法,这将取消隐藏 UINavigationController 工具栏(使工具栏在子视图控制器中可见),然后执行弹出动画。弹出动画的其余部分按预期执行(UINavigationController 工具栏在父视图控制器中仍然可见,所有内容都已适当调整大小)。
有点想这个问题会引人入胜。我剩下的唯一想法是:
1) EDIT #1(尽管该实现受限于无法适当或合法地改变 iPod Touch 或 iPhone 处于横向的标准 UIToolbar 实例的高度;我这样做的一个原因坚决使用 UINavigationController 的工具栏)。
2) 子类 UITabBar 或 UITabBarController 试图阻止 setHidesBottomBarWhenPushed: 方法意识到 UITabBarController 选项卡栏是底部栏。基本上,绕过标签栏并传递 UINavigationController 工具栏。可能是最有前途的想法,但也可能是最困难的(因为 setHidesBottomBarWhenPushed: innards 的知识是有限的,而且可能需要私有 API)。
【问题讨论】:
您想隐藏什么或在下一个屏幕中显示什么?如果可能的话显示代码 我在帖子中添加了 EDIT #3。这将使您了解我现在拥有的内容(使用将 hidesBottomBarWhenPushed 设置为 YES 用于我正在深入研究的 UIViewController)。而且,它会让您了解我想要实现的目标。我开始认为 EDIT #1 可能是最简单的解决方案。但是,它也是最庞大的解决方案。更不用说,要调整 UIToolbar 实例的高度(如 UINavigationController 工具栏),您需要设置工具栏的 autoResizingMask 或框架,HIG 似乎不建议这两者。 【参考方案1】:当您按下导航栏控制器时 像这样写代码
YourController = [[YourController alloc] initWithNibName:@"YourController" bundle:nil]
controller.hidesBottomBarWhenPushed = TRUE;
[self.navigatoinController pushViewController:controller Animated:YES];
//// Try this code where you want to hide navigation bar
-(void)viewWillAppear
self.navigationController.navigationBarHidden = TRUE;
【讨论】:
谢谢hiren443。确切地。这就是我所拥有的。而且,根据定义,我认为它有效。它隐藏了底部栏(在本例中为 UITabBarController 选项卡栏)。不幸的是,我不想隐藏标签栏,我想隐藏 UINavigationController 工具栏(倒数第二个栏)。这段代码原样生成 EDIT #3 中的第一个图像。我想在 EDIT #3 中实现第二张图片。 嗨,hiren443。您提供了与 VinceBurn 类似的解决方案,因此我回复了上面的 EDIT #4。 那么你是不是把底部栏中的工具栏放在标签栏上方?你想隐藏这个工具栏吗? 仅供参考,在故事板中,有一个用于推送视图的选项 @vinnybad Thanx,我对故事板模式一无所知【参考方案2】:在您的UIViewController
的方法viewWillAppear
中进行以下调用
[self.navigationController setToolbarHidden:YES animated:NO];
那个栏属于 UINavigationController。虽然我从未使用过hidesBottomBarWhenPushed
,但它看起来像是它可以找到的最底栏。
【讨论】:
谢谢你,文斯伯恩。我忘了说,我也试过这个。显然,这允许您隐藏和取消隐藏 UINavigationController 工具栏。那挺好的。唯一的问题:隐藏时,不是用 UIViewController 用 UITableView 滑出,而是一直可见,直到推送的 UIViewController 可见,然后向下滑动。弹回时向上滑动,而不是滑动。 @NicholasPeters 传递它animated:NO
你会得到你想要的
你好文斯伯恩。您提供了与 hiren443 类似的解决方案,所以我回复了上面的 EDIT #4。以上是关于带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章
在 UINavigationController 中添加带有标题的图像
带有自定义 NavigationBar 的 UINavigationController
带有 uinavigationcontroller 和 uitabbarcontroller 的 iphone 应用程序
UINavigationController 推送带有隐藏导航栏的视图控制器