Скрытие tabBar, показывающее черную полосу в Ios7
Я использую этот код, чтобы скрыть TabBar:
self.tabBarController.tabBar.hidden=YES;
Я скрываю tabBarController в своем проекте. но он показывает черную полосу в нижней части окна в Ios7.Когда я возвращаюсь к тому же виду, это выглядит хорошо. Любая помощь будет оценена.
Ответы
Ответ 1
ПРИМЕЧАНИЕ. Это решение только для iOS6 и 7.
В iOS 7, чтобы расширить зону с интерактивным доступом и скрыть черную полосу на месте скрытого UITabBar, вы должны включить опцию "Расширить края - под непрозрачными барами" для вас UIViewController.
![Extend Edges - Under Opaque Bars option]()
Или вы можете установить это свойство программно:
[self setExtendedLayoutIncludesOpaqueBars: YES]
Вот пример кода, который скрывает или перемещает TabBar для iOS 6/7:
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];
}
}
}
Функция перемещения экранной панели вкладки получена из этого сообщения.
Ответ 2
Следующий код работает для меня
- (void)showTabBar {
[self.tabBar setTranslucent:NO];
[self.tabBar setHidden:NO];
}
- (void)hideTabBar {
[self.tabBar setTranslucent:YES];
[self.tabBar setHidden:YES];
}
Ответ 3
Попробуйте следующее:
- (BOOL)hidesBottomBarWhenPushed {
return YES;
}
Ответ 4
У меня возникли проблемы при использовании UINavigationController:
Здесь мое решение, которое работает для iOS 7 и UINavigationControllers:
HeaderFile
@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
Благодаря Вадим Труляев за то, что он указал на "Расширить края" - под символом "Непрозрачные бары"!
Ответ 5
Ответ одной строки Swift 3.
Поместите в подкласс UIViewController следующее:
override var hidesBottomBarWhenPushed: Bool { get { return true } set { self.hidesBottomBarWhenPushed = newValue }}
Ответ 6
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];
}
Ответ 7
Я долгое время боролся с этим, пытаясь разместить отзывчивую кнопку внизу таблицы. Я не использую авто-макет. Я обнаружил два основных отличия между iOS 6 и 7:
-
На iOS7, когда панель вкладок анимирована, представление контроллера корневого представления не распространяется на область, где была панель вкладок; его необходимо изменить.
-
На 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, если вы поворачиваете с портрета на пейзаж, когда панель вкладок скрыта, черный ящик снова появляется. Я решил это, оживив панель вкладок на экране перед анимацией вращения (что было достаточно для того, над чем я работаю).
Ответ 8
Основываясь на решении @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, чтобы вкладка бар должен быть скрыт, появляется черное пространство. Кто-нибудь может мне помочь?!
Спасибо!
Ответ 9
В дополнение к другим отличным предложениям следующее предложение может помочь кому-то. Попробуйте настроить свою вкладку на скрытую в awakeFromNib, а не на более позднем этапе жизненного цикла. Я обнаружил, что скрытая вкладка мигает черным цветом, и это исправило это для меня.
- (void)awakeFromNib
{
[super awakeFromNib];
self.tabBarController.tabBar.hidden = YES;
}
Ответ 10
Установите true
свойство hidesBottomBarWhenPushed
в контроллере, чтобы скрыть.
Для скрытия, все ваши контроллеры помещены в prepare for segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
segue.destination.hidesBottomBarWhenPushed = true
}