tab item bar ios swift uitabbar

ios - item - Ocultando la barra de pestañas y quitando el espacio.



uitabbarcontroller swift 4 (11)

A veces, la forma más sencilla es simplemente agregar una vista que use los límites de UIScreen.

let whiteView = UIView() whiteView.backgroundColor = .white view.addSubview(whiteView) whiteView.translatesAutoresizingMaskIntoConstraints = false whiteView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true whiteView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true whiteView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true whiteView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.height).isActive = true

Porque a veces los bordes de la vista se extienden más allá de la barra de navegación, lo que le da nuevos problemas si extiende el diseño de la vista.

¿Hay alguna forma de ocultar la barra de pestañas y eliminar ese espacio (alrededor de 50px)?

Lo intenté

self.tabBarController?.tabBar.hidden = true self.extendedLayoutIncludesOpaqueBars = true

Sin suerte. Veo espacios en blanco.


Después vi tu captura de pantalla en el comentario. Creo que puedes intentar establecer hidesBottomBarWhenPushed en true.

hidesBottomBarWhenPushed = true

O el guión gráfico.

Ocultará la barra inferior automáticamente cuando empujó a otro controlador de vista, y aparecerá nuevamente cuando regrese.


Este código funciona en iOS 10, 11 y iPhone X (incluidos los simuladores) para mostrar / ocultar la barra de herramientas . Lo creé varios años (¿iOS 7 marco de tiempo?) Y ha funcionado de manera confiable desde entonces.

Funciona a la perfección en el iPhone X siempre que el contenido del contenido de sus controladores de visualización del niño (en pestañas) esté topLayoutGuide en topLayoutGuide , bottomLayoutGuide o SafeArea y no en las principales paredes de las vistas. Entonces todo funciona. ¡Disfrutar!

@interface UITabBarController (HideTabBar) @property (nonatomic, getter=isTabBarHidden) BOOL tabBarHidden; -(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated; @end @implementation UITabBarController (HideTabBar) -(BOOL)isTabBarHidden { CGRect viewFrame = self.view.frame; CGRect tabBarFrame = self.tabBar.frame; return tabBarFrame.origin.y >= viewFrame.size.height; } -(void)setTabBarHidden:(BOOL)hidden { [self setTabBarHidden:hidden animated:NO]; } -(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated { BOOL isHidden = self.tabBarHidden; if(hidden == isHidden)return; UIView *transitionView = [[[self.view.subviews reverseObjectEnumerator] allObjects] lastObject]; if(transitionView == nil) { NSLog(@"UITabBarCategory can''t get the container view"); return; } CGRect viewFrame = self.view.bounds; CGRect tabBarFrame = self.tabBar.frame; CGRect containerFrame = transitionView.frame; CGRect selectedVCFrame = containerFrame; tabBarFrame.origin.y = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height); containerFrame.size.height = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height); if([self.moreNavigationController.viewControllers containsObject:self.selectedViewController]) { selectedVCFrame = self.selectedViewController.view.frame; selectedVCFrame.size.height += hidden ? tabBarFrame.size.height : -tabBarFrame.size.height; } self.selectedViewController.view.frame = selectedVCFrame; [UIView animateWithDuration:.5 animations:^{ self.tabBar.frame = tabBarFrame; transitionView.frame = containerFrame; [self.selectedViewController.view setNeedsLayout]; }]; } @end

Uso : lo llamo en el viewController en eventos de rotación así:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; // Hide TabBar on iPhone, iPod Touch if([UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPad) { if(_startDateEditor.editing) return; if(fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || fromInterfaceOrientation == UIInterfaceOrientationPortrait) [self.tabBarController setTabBarHidden:YES animated:YES]; else [self.tabBarController setTabBarHidden:NO animated:YES]; } }


La tercera respuesta a esta pregunta me funciona de la siguiente manera:

El código en mi controlador de vista

@IBAction func buttonPressed(sender: AnyObject) { setTabBarVisible(!tabBarIsVisible(), animated: true) } func setTabBarVisible(visible: Bool, animated: Bool) { // hide tab bar let frame = self.tabBarController?.tabBar.frame let height = frame?.size.height var offsetY = (visible ? -height! : height) print ("offsetY = /(offsetY)") // zero duration means no animation let duration:NSTimeInterval = (animated ? 0.3 : 0.0) // animate tabBar if frame != nil { UIView.animateWithDuration(duration) { self.tabBarController?.tabBar.frame = CGRectOffset(frame!, 0, offsetY!) self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY!) self.view.setNeedsDisplay() self.view.layoutIfNeeded() return } } } func tabBarIsVisible() -> Bool { return self.tabBarController?.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height }

En el guión gráfico:

El color de fondo de la vista principal del controlador de vista es de color negro:

Luego, podría tener otra vista en el interior (color de fondo blanco), espacio al final y espacio restringido para supervisar y espacio superior e inferior a la guía de diseño.

Y el resultado es:


Mi forma preferida de hacerlo es usar un controlador de envoltura. Si quiero ocultar la barra de pestañas, solo aumento la altura del controlador de la barra de pestañas, por lo que efectivamente la barra de pestañas se mueve fuera de la pantalla.

Con esta solución, no necesita hackear el marco de la barra de pestañas y no depende de la animación de inserción del controlador de navegación:

import UIKit class ViewController: UIViewController { let tabController: UITabBarController = { let tabController = UITabBarController() // setup your tabbar controller here return tabController; }() var tabbarHidden = false { didSet { var frame = self.view.bounds; if (tabbarHidden) { frame.size.height += self.tabController.tabBar.bounds.size.height; } self.tabController.view.frame = frame; } } override func viewDidLoad() { super.viewDidLoad() // add the tab controller as child controller addChildViewController(self.tabController) self.tabController.view.frame = self.view.bounds self.tabController.view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] self.view.addSubview(self.tabController.view) self.tabController.didMoveToParentViewController(self) // for debugging let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(switchTabbar)) self.tabController.view.addGestureRecognizer(tapRecognizer) } override func childViewControllerForStatusBarStyle() -> UIViewController? { return self.tabController } override func childViewControllerForStatusBarHidden() -> UIViewController? { return self.tabController } func switchTabbar() { UIView.animateWithDuration(0.3) { self.tabbarHidden = !self.tabbarHidden } } }


Para aquellos que les gusta hacer todo programáticamente, agregue esta línea al método init de un ViewController que no debería tener la barra de herramientas:

hidesBottomBarWhenPushed = true


Programáticamente, agregue esto al siguiente controlador de vista para swift 4.

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tabBarController?.tabBar.isHidden = true edgesForExtendedLayout = UIRectEdge.bottom extendedLayoutIncludesOpaqueBars = true }

Y añada un color de fondo.


Sí. Puedes ocultar tu barra de pestañas cuando presionas para ver el controlador. Puedes mostrar la barra de pestañas en tu casa. Puede ocultar su barra de pestañas cuando presione el siguiente controlador de Vista.

Vea la barra de Botones Ocultar en la imagen siguiente de inserción y establezca en todos los controles de visualización donde no desee la barra de pestañas.

Espero eso ayude..


Si aún está viendo una franja negra debajo de la barra de pestañas oculta, ¿ha intentado seleccionar Extender bordes debajo de las barras opacas aquí?

Asegúrese también de que las Barras inferiores inferiores aún estén seleccionadas. ¡Espero eso ayude!


NOTA: esta solución es solo para eliminar el espacio en blanco que queda después de ocultar la barra de pestañas.

Para ocultar la barra de pestañas, la mejor solución es: @Michael Campsall responda aquí.

La solución más simple para esto es cambiar las restricciones de la parte inferior de su vista (en mi caso, su TableView), en lugar de dar restricciones de la parte inferior con BottomLayoutGuide y darle la supervisión. Capturas de pantalla adjuntas para referencia.

Las restricciones que se muestran en las capturas de pantalla de abajo crean el problema, cámbielo de acuerdo con la siguiente captura de pantalla.

Las restricciones reales para eliminar espacios en blanco deben estar de acuerdo con esta captura de pantalla (a continuación).


Swift 3 :

extension UITabBarController { func setTabBarVisible(visible:Bool, duration: TimeInterval, animated:Bool) { if (tabBarIsVisible() == visible) { return } let frame = self.tabBar.frame let height = frame.size.height let offsetY = (visible ? -height : height) // animation UIViewPropertyAnimator(duration: duration, curve: .linear) { self.tabBar.frame.offsetBy(dx:0, dy:offsetY) self.view.frame = CGRect(x:0,y:0,width: self.view.frame.width, height: self.view.frame.height + offsetY) self.view.setNeedsDisplay() self.view.layoutIfNeeded() }.startAnimation() } func tabBarIsVisible() ->Bool { return self.tabBar.frame.origin.y < UIScreen.main.bounds.height } }

Para usar (si, por ejemplo, self es un UITabBarController ):

self.setTabBarVisible(visible: false, duration: 0.3, animated: true)

Swift 2.x:

extension UITabBarController { func setTabBarVisible(visible:Bool, duration: NSTimeInterval, animated:Bool) { if (tabBarIsVisible() == visible) { return } let frame = self.tabBar.frame let height = frame.size.height let offsetY = (visible ? -height : height) // animation UIView.animateWithDuration(animated ? duration : 0.0) { self.tabBar.frame = CGRectOffset(frame, 0, offsetY) self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY) self.view.setNeedsDisplay() self.view.layoutIfNeeded() } } func tabBarIsVisible() ->Bool { return self.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height } }

Usar:

self.tabBarController?.setTabBarVisible(visible: false, duration: 0.3, animated: true)