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.
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..
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)