IOS 7 скрыть вкладку

Скрыть панель в IOS7 показывает неформальное поведение

Когда я использую

self.tabBarController.tabBar.hidden = YES;

Выше кода скрывает tabBar, но мой снизу снизу не остается интерактивным

Но когда я использую это непосредственно перед нажатием viewController в навигации

someViewController.hidesBottomBarWhenPushed = YES
[self.navigationController pushViewController:someViewController animated:YES];

Он скрывает вкладку, а также вид снизу также является интерактивным. но проблема в этом случае заключается в том, что когда мы pop viewController, он показывает черную полосу чуть выше табло в течение нескольких секунд.

5 ответов

Надеюсь, у вас есть решение. Просто, чтобы убедиться, вы попробовали

self.edgesForExtendedLayout = UIRectEdgeBottom;


Я думаю, что обе проблемы возникли из-за плохого/отсутствующего autoresizingMask или отсутствующих ограничений автоматической компоновки (в зависимости от того, что вы используете).

То, что UITabBarController делает при скрытии панели вкладок, достаточно растянуть ее view, чтобы получить ее tabBar вне экрана. В свою очередь, ваши просмотренные контроллеры представлений должны правильно растягиваться, чтобы использовать новое пространство, или вы получите пустое пространство и/или неинтерактивные зоны.

Edit:

Просто понял, что скрытие панели вкладок не входит в SDK по умолчанию, но в category я сделал давным-давно.

В любом случае растягивание рамки UITabBarController представляется мне самым элегантным способом "скрыть" панель вкладок (фактически отвести ее от экрана), так как вам не нужно иметь дело с subviews или выслеживать рамку панели вкладок непосредственно.


Попробуйте это, если вы хотите скрыть/показать UITabBarController представления:

Для скрытия вкладки:

- (void)hideTabBar:(UITabBarController *) tabbarcontroller
 {
 for(UIView *view in tabbarcontroller.view.subviews)
 {
 if([view isKindOfClass:[UITabBar class]])
 {
 [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
 }
 else
 {
 [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
 }
 }
 }

для показать вкладку:

- (void)showTabBar:(UITabBarController *) tabbarcontroller
 {
 for(UIView *view in tabbarcontroller.view.subviews)
 {
 if([view isKindOfClass:[UITabBar class]])
 {
 [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];
 }
 else
 {
 [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
 }
 }
 }

Возможно, это поможет.


Итак, я переписал некоторые ответы, написанные в Objective-C, в Swift 3.0, думая, что это сработает. Здесь код:

func hideTabBar() {
 let tabBarControllerView = self.tabBarController?.view
 if let tabBarControllerSubviews = tabBarControllerView?.subviews {
 for view in tabBarControllerSubviews {
 if view is UITabBar {
 view.frame = CGRect(
 x: view.frame.origin.x,
 y: (UIScreen.main.bounds.size.height == 568 ? 568 : 480) + 20,
 width: self.view.frame.size.width,
 height: self.view.frame.size.height
 )
 } else {
 view.frame = CGRect(
 x: view.frame.origin.x,
 y: view.frame.origin.y,
 width: self.view.frame.size.width,
 height: UIScreen.main.bounds.size.height == 568 ? 568 : 480
 )
 }
 }
 }
}
func showTabBar() {
 let tabBarControllerView = self.tabBarController?.view
 if let tabBarControllerSubviews = tabBarControllerView?.subviews {
 for view in tabBarControllerSubviews {
 if view is UITabBar {
 view.frame = CGRect(
 x: view.frame.origin.x,
 y: (UIScreen.main.bounds.size.height == 568 ? 519 : 431),
 width: self.view.frame.size.width,
 height: self.view.frame.size.height
 )
 } else {
 view.frame = CGRect(
 x: view.frame.origin.x,
 y: view.frame.origin.y,
 width: self.view.frame.size.width,
 height: UIScreen.main.bounds.size.height == 568 ? 519 : 431
 )
 }
 }
 }
}


Используйте следующий код для решения вашей проблемы.

Скрыть:

-(void)hideTabBar:(UITabBarController *)tabbarcontroller
 {
 CGRect screenRect = [[UIScreen mainScreen] bounds];
 float fHeight = screenRect.size.height;
 if( UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
 {
 fHeight = screenRect.size.width;
 }
 for(UIView *view in tabbarcontroller.view.subviews)
 {
 if([view isKindOfClass:[UITabBar class]])
 {
 [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
 }
 else
 {
 [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
 view.backgroundColor = [UIColor blackColor];
 }
 }
 }

Показать:

-(void)showTabBar:(UITabBarController *) tabbarcontroller
{
 CGRect screenRect = [[UIScreen mainScreen] bounds];
 float fHeight = screenRect.size.height - 49.0;
 if( UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
 {
 fHeight = screenRect.size.width - 49.0;
 }
 for(UIView *view in tabbarcontroller.view.subviews)
 {
 if([view isKindOfClass:[UITabBar class]])
 {
 [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
 }
 else
 {
 [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
 }
 }
}

Используйте эти методы в представленииWillAppear и методах вращения устройства согласно вашему требованию

licensed under cc by-sa 3.0 with attribution.