隐藏 TabBar 并在按钮单击时显示 NavigationController 工具栏
Posted
技术标签:
【中文标题】隐藏 TabBar 并在按钮单击时显示 NavigationController 工具栏【英文标题】:Hide TabBar and show NavigationController toolbar on button click 【发布时间】:2014-06-22 16:27:26 【问题描述】:我有以下视图层次结构:
标签栏控制器 -> 导航控制器 -> 自定义视图控制器
在我的自定义视图中,我希望 TabBar 消失并显示一个工具栏。就像在 ios7 原生照片应用中按下“选择”时一样。
我尝试了不同的 SO 解决方案,但都成功了:
-
TabBar 隐藏,Toolbar 以黑色间隙显示
TabBar 隐藏和 Toolbar 隐藏
TabBar 隐藏工具栏与底部有间隙。但是,自定义视图内容会到达屏幕底部(在工具栏下方和标签栏之前所在的位置)
与我发现的其他解决方案的不同之处在于,我需要在点击而不是推送时发生这种情况。
我尝试过的一些事情:
// #1
[self.navigationController.toolbar setHidden:!isSelecting];
[self.tabBarController.tabBar setHidden:isSelecting];
// #2
self.hidesBottomBarWhenPushed = YES;
// #3
#1 & #2 variants @ different controller along the path
【问题讨论】:
“与我发现的其他解决方案的不同之处在于,我需要在点击而不是推送时发生这种情况。”嗯……什么? 你能分享一些你所取得的代码或截图吗?您是否尝试调整自定义视图控制器的视图大小以填补您得到的空白? 我怀疑当您触摸“选择”按钮时,“照片”应用正在进行模态演示(没有动画)。如果您呈现一个带有工具栏的控制器,它将覆盖标签栏,并呈现您在照片中看到的外观。 @LordZsolt,我的意思是我认为建议使用hidesBottomBarWhenPushed
的答案在这种情况下不起作用。但也许我错了。
@NikolasBurk,我没有尝试调整大小。添加了一些代码。
【参考方案1】:
最终,在玩了这些设置之后,我设法让它工作了。我不知道为什么它现在可以工作而以前不能工作,所以我很感激你的 cmets。
故事板:
-
为自定义视图控制器标记为选中“按下时隐藏底栏”
为导航控制器标记为选中的“显示工具栏”
代码:
点击按钮隐藏/取消隐藏tabBar:[self.tabBarController.tabBar setHidden:state]
这几乎可行。按下按钮时它会隐藏/取消隐藏 tabBar,但唯一的问题是 tabBar 在切换选项卡时最初是隐藏的。我必须做一些额外的努力才能让它可见。
设置UITabBarControllerDelegate
在切换标签时取消隐藏tabBar。我在自定义SUSourceTabController
中做到了:
- (void)viewDidLoad
[super viewDidLoad];
self.delegate = self;
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController: (UIViewController *)viewController
[self.tabBar setHidden:NO];
我们还需要为自定义视图控制器代码中的第一个选项卡视图取消隐藏它。在代码中的任何其他位置使用 setHidden:NO
均无效。
- (void)viewDidLoad
[super viewDidLoad];
[self.tabBarController.tabBar setHidden:NO];
【讨论】:
啊,这对我很有帮助。但是,对我来说,将“Hide Bottom Bar on Push”设置为 true 就足够了。谢谢! 唯一让我最终得到我想要的答案。需要在一个选项卡中有一个表 VC 控制器有一个“编辑”选项。编辑模式允许多选。我需要隐藏标签栏并显示一个工具栏。我正在使用 iOS 9 并且切换 tabBar 和工具栏状态很容易(我做的和 OP 一样)。这个答案展示了如何在切换标签时防止 tabBar 隐藏。另外,我不需要执行第二部分(“为第一个选项卡视图取消隐藏它”),因为我使用第二个选项卡作为起始选项卡(在自定义 TabController 的 viewDidLoad 中使用 selectedIndex = 1) 无法消除间隙(xcode 8,iOS 8.2)。要解决此问题,必须使用另一个工具栏而不是 self.navigationController.toolbar,并添加一个约束 'Bottom Space to Superview = 0' 而不是底部布局指南。 如果您将底部限制为超级视图而不是布局指南,它在 iPhone X 上看起来不像预期的那样 ? ***.com/questions/48236375/… 实现了@Xyand 的解决方案并在iPhone X 上正常运行。【参考方案2】:从question 的回答中检查这个类别。
UITabBarController+HideTabbar.h
#import <UIKit/UIKit.h>
@interface UITabBarController (HideTabbar)
- (void)setHidden:(BOOL)hidden animated:(BOOL)animated;
@end
UITabBarController+HideTabbar.m
#import "UITabBarController+HideTabbar.h"
#define kAnimationDuration .3
@implementation UITabBarController (HideTabbar)
- (void)setHidden:(BOOL)hidden animated:(BOOL)animated
CGRect screenRect = [[UIScreen mainScreen] bounds];
float fHeight = screenRect.size.height;
if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))
fHeight = screenRect.size.width;
if (!hidden)
fHeight -= self.tabBar.frame.size.height;
CGFloat animationDuration = animated ? kAnimationDuration : 0.f;
[UIView animateWithDuration:animationDuration animations:^
for (UIView *view in self.view.subviews)
if ([view isKindOfClass:[UITabBar class]])
[view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
else
if (hidden)
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
completion:^(BOOL finished)
if (!hidden)
[UIView animateWithDuration:animationDuration animations:^
for(UIView *view in self.view.subviews)
if (![view isKindOfClass:[UITabBar class]])
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
];
];
@end
【讨论】:
以上是关于隐藏 TabBar 并在按钮单击时显示 NavigationController 工具栏的主要内容,如果未能解决你的问题,请参考以下文章