我正在使用此代码来隐藏 TabBar:
self.tabBarController.tabBar.hidden=YES;
我在我的项目中隐藏了 tabBarController。但它在 Ios7 的视图底部显示黑条。当我回到同一个视图时,它看起来不错。任何帮助将不胜感激。
我正在使用此代码来隐藏 TabBar:
self.tabBarController.tabBar.hidden=YES;
我在我的项目中隐藏了 tabBarController。但它在 Ios7 的视图底部显示黑条。当我回到同一个视图时,它看起来不错。任何帮助将不胜感激。
注意:它仅适用于 iOS6 和 7。
在 iOS 7 中,要扩展可点击区域并在隐藏的 UITabBar 的位置隐藏黑条,您应该为 UIViewController 启用“扩展边缘 - 在不透明条下”选项。
或者您可以通过编程方式设置此属性:
[self setExtendedLayoutIncludesOpaqueBars:YES]
下面是隐藏或移动 iOS 6/7 的 TabBar 的代码示例:
UITabBarController *bar = [self tabBarController];
if ([self respondsToSelector:@selector(setExtendedLayoutIncludesOpaqueBars:)]) {
//iOS 7 - hide by property
NSLog(@"iOS 7");
[self setExtendedLayoutIncludesOpaqueBars:YES];
bar.tabBar.hidden = YES;
} else {
//iOS 6 - move TabBar off screen
NSLog(@"iOS 6");
CGRect screenRect = [[UIScreen mainScreen] bounds];
float height = screenRect.size.height;
[self moveTabBarToPosition:height];
}
//Moving the tab bar and its subviews offscreen so that top is at position y
-(void)moveTabBarToPosition:(int)y {
self.tabBarController.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.size.height);
for(UIView *view in self.tabBarController.view.subviews) {
if ([view isKindOfClass:[UITabBar class]]) {
[view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)];
} else {
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)];
view.backgroundColor = [UIColor blackColor];
}
}
}
将标签栏移出屏幕的功能来自这篇文章。
下一个代码对我有用
- (void)showTabBar {
[self.tabBar setTranslucent:NO];
[self.tabBar setHidden:NO];
}
- (void)hideTabBar {
[self.tabBar setTranslucent:YES];
[self.tabBar setHidden:YES];
}
尝试这个:
- (BOOL)hidesBottomBarWhenPushed {
return YES;
}
我在使用 UINavigationController 时遇到了一些麻烦:
这是适用于 iOS 7 和 UINavigationControllers 的解决方案:
头文件
@interface UITabBarController (HideTabBar)
- (void)setHideTabBar:(BOOL)hide animated:(BOOL)animated;
@end
执行
#import "UITabBarController+HideTabBar.h"
@implementation UITabBarController (HideTabBar)
- (void)setHideTabBar:(BOOL)hide animated:(BOOL)animated {
UIViewController *selectedViewController = self.selectedViewController;
/**
* If the selectedViewController is a UINavigationController, get the visibleViewController.
* - setEdgesForExtendedLayout won't work with the UINavigationBarController itself.
* - setExtendedLayoutIncludesOpaqueBars won't work with the UINavigationBarController itself.
*/
if ([selectedViewController isKindOfClass:[UINavigationController class]])
selectedViewController = ((UINavigationController *)selectedViewController).visibleViewController;
__weak __typeof(self) weakSelf = self;
void (^animations)(void) = ^{
selectedViewController.edgesForExtendedLayout = UIRectEdgeAll;
[selectedViewController setExtendedLayoutIncludesOpaqueBars:hide];
weakSelf.tabBar.hidden = hide;
/**
* Just in case we have a navigationController, call layoutSubviews in order to resize the selectedViewController
*/
[selectedViewController.navigationController.view layoutSubviews];
};
[UIView animateWithDuration:animated ? UINavigationControllerHideShowBarDuration : 0 animations:animations];
}
@end
感谢Vadim Trulyaev指出“ Extend Edges - Under Opaque Bars”标志!
一行 Swift 3 答案。
将以下内容放入您的 UIViewController 子类中:
override var hidesBottomBarWhenPushed: Bool { get { return true } set { self.hidesBottomBarWhenPushed = newValue }}
将控制器中true
的属性设置hidesBottomBarWhenPushed
为隐藏。
对于隐藏,您所有的控制器都放入prepare for segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
segue.destination.hidesBottomBarWhenPushed = true
}
我花了很长时间来解决这个问题,试图在表格视图的底部放置一个响应按钮。我没有使用自动布局。我发现 iOS 6 和 7 之间有两个主要区别:
在 iOS7 上,当 tab bar 动画出来时,root view controller 的 view 不会延伸到 tab bar 所在的区域;它需要调整大小。
在 iOS7 上,只有 UITabBar 类型的视图需要在屏幕上进行动画关闭和显示。
第 1 点的另一个问题是,如果在 iOS7 中,您将可见视图控制器主视图的子视图扩展到选项卡视图留下的空间,除非主视图也被扩展,否则它将无法交互。考虑到这一点,我使用了以下代码:
隐藏标签栏(反转数学所以显示它):
[UIView animateWithDuration:kHideTabBarAnimationDuration animations:^{
for(UIView *view in self.tabBarController.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y + view.frame.size.height, view.frame.size.width, view.frame.size.height)];
}
else
{
if (![MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height + self.tabBarController.tabBar.frame.size.height)];
}
}
}
} completion:nil];
隐藏标签栏时调整主视图:
// Expand view into the tab bar space
if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
CGRect frame = self.view.frame;
self.view.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
frame.size.height + tabBarHeight);
}
显示标签栏时调整主视图:
[UIView animateWithDuration:kHideTabBarAnimationDuration delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
// Create space for the tab bar
if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
CGRect frame = self.view.frame;
self.view.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
frame.size.height - tabBarHeight);
}
} completion:nil];
请注意,隐藏标签栏时我不会为主视图扩展设置动画,这看起来很自然,因为扩展发生在标签栏后面。
另请注意
在 iOS 7 中,如果您在标签栏隐藏的情况下从纵向旋转到横向,则会再次出现黑框。我通过在旋转动画之前将标签栏动画化回到屏幕上解决了这个问题(这对于我正在处理的工作来说已经足够好了)。
To showTabbar:
- (void)showTabBar:(UITabBarController *) tabbarcontroller
{
//[UIView beginAnimations:nil context:NULL];
//[UIView setAnimationDuration:0.5];
for(UIView *view in tabbarcontroller.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, 521, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 521)];
}
}
// [UIView commitAnimations];
}
To hide Tabbar:
- (void)hideTabBar:(UITabBarController *) tabbarcontroller
{
//[UIView beginAnimations:nil context:NULL];
//[UIView setAnimationDuration:0.5];
for(UIView *view in tabbarcontroller.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, 568, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 568)];
}
}
//[UIView commitAnimations];
}
基于@Vadim Trulyaev 的解决方案,我创建了一个简单的用法:
UITabBarController+HideTabBar.h
@interface UITabBarController (Additions)
- (void)setTabBarHidden:(BOOL)hidden myClass:(UIViewController *)myClass;
@end
UITabBarController+HideTabBar.m
#import "UITabBarController+HideTabBar.h"
@implementation UITabBarController (HideTabBar)
- (void)setTabBarHidden:(BOOL)hidden myClass:(UIViewController *)myClass{
if ([myClass respondsToSelector:@selector(setExtendedLayoutIncludesOpaqueBars:)]) {
//iOS 7 - hide by property
NSLog(@"iOS 7");
[myClass setExtendedLayoutIncludesOpaqueBars:hidden];
self.tabBar.hidden = hidden;
} else {
//iOS 6 - move TabBar off screen
NSLog(@"iOS 6");
CGRect screenRect = [[UIScreen mainScreen] bounds];
float height = screenRect.size.height;
if(hidden){
[self moveTabBarToPosition:height];
}else{
[self moveTabBarToPosition:height - self.tabBar.frame.size.height];
}
}
}
//Moving the tab bar and its subviews offscreen so that top is at position y
-(void)moveTabBarToPosition:(int)y {
self.tabBar.frame = CGRectMake(self.tabBarController.tabBar.frame.origin.x, y, self.tabBar.frame.size.width, self.tabBar.frame.size.height);
for(UIView *view in self.view.subviews) {
if ([view isKindOfClass:[UITabBar class]]) {
[view setFrame:CGRectMake(view.frame.origin.x, y, view.frame.size.width, view.frame.size.height)];
} else {
NSLog(@"%f",view.frame.size.height);
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, y)];
NSLog(@"%f",view.frame.size.height);
view.backgroundColor = [UIColor blackColor];
}
}
}
@end
如何使用:
[[self tabBarController] setTabBarHidden:NO myClass:self];
但是,在 iOS6 中我有一些问题,当我第一次去 ViewController1 隐藏标签栏时一切正常,但是如果我去一个显示标签栏的 ViewController2 并返回到 ViewController1 必须隐藏标签栏,黑色空间出现。任何人都可以帮助我?!
谢谢!
除了其他出色的建议之外,以下建议可能会对某人有所帮助。尝试将标签栏设置为隐藏在 awakeFromNib 中,而不是在生命周期的后期。我发现隐藏的标签栏在 segue 上闪烁黑色,这为我修复了它。
- (void)awakeFromNib
{
[super awakeFromNib];
self.tabBarController.tabBar.hidden = YES;
}