带有 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 和一个UITableViewUINavigationController 工具栏未隐藏。

但是,当我在UITableView 中选择一行时,我想推送另一个UIViewController。按下此 UIViewController 时,UINavigationController 工具栏应滑出,UITabBarController 标签栏应保持可见。

我尝试将推送的UIViewController 的 hidesBottomBarWhenPushed 属性设置为 true(当UINavigationController 未嵌套在UITabBarController 中时,它提供了预期的行为)。不幸的是,当 hidesBottomBarWhenPushed 设置为 true 时,UITabBarController 滑出,UINavigationController 在被推送的UIViewController 中作为底部栏可见,而不是将 UINavigationController 工具栏滑出。

如何在按下时滑出UINavigationController 工具栏,而不是UITabBarController 标签栏?

编辑 #1: 我能想到的唯一可能的解决方案是,而不是使用UINavigationController 工具栏,只需将UIToolbar 添加到包含UITableViewUIViewController 视图的底部。这将确保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 推送带有隐藏导航栏的视图控制器

带有自定义垂直按钮栏的 UINavigationController

带有 UINavigationController 作为选项卡的 UITabViewController