Existe-t-il un moyen de masquer la barre de tabulation et de supprimer cet espace (environ 50 pixels)?
J'ai essayé
self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true
Pas de chance. Je vois un espace vide.
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
}
}
Pour utiliser (si par exemple self
est une 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
}
}
Utiliser:
self.tabBarController?.setTabBarVisible(visible: false, duration: 0.3, animated: true)
Après avoir vu votre capture d'écran en commentaire. Je pense que vous pouvez essayer de définir hidesBottomBarWhenPushed
sur true.
hidesBottomBarWhenPushed = true
Ou storyboard.
Elle masquera automatiquement la barre inférieure lorsque vous appuierez sur un autre contrôleur de vue et la reverret lorsque vous revenez.
NOTE - Cette solution consiste simplement à supprimer l’espace blanc après avoir caché la barre de tabulation.
Pour masquer la barre de tabulation, la meilleure solution est - @Michael Campsall répondez ici
La solution la plus simple consiste à modifier les contraintes de fond de votre vue (dans mon cas, son tableau), au lieu de définir des contraintes de fond avec BottomLayoutGuide. Captures d'écran ci-joint pour référence.
Les contraintes montrées dans les captures d'écran ci-dessous créent le problème, modifiez-les en fonction de la capture d'écran suivante.
Les contraintes réelles pour supprimer les espaces doivent être conformes à cette capture d'écran (ci-dessous).
La troisième réponse sur cette question fonctionne pour moi de la manière suivante:
Le code sur mon contrôleur de vue
@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
}
Dans le storyboard:
La couleur d'arrière-plan de la vue principale du contrôleur de vue est la couleur noire:
Ensuite, vous pouvez avoir une autre vue à l'intérieur (couleur d'arrière-plan blanche), un espace de fuite suivi et délimité par des espaces à superview ainsi que des espaces supérieur et inférieur par rapport au guide de disposition.
Et le résultat est:
Par programme, ajoutez ceci au prochain contrôleur de vue pour Swift 4.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tabBarController?.tabBar.isHidden = true
edgesForExtendedLayout = UIRectEdge.bottom
extendedLayoutIncludesOpaqueBars = true
}
Et ajouter une couleur de fond
Ma méthode préférée consiste à utiliser un contrôleur d’emballage. Si je veux masquer la barre d'onglets, j'augmente simplement la hauteur du contrôleur de barre d'onglets. Ainsi, la barre d'onglets est déplacée hors de l'écran.
Avec cette solution, vous n'avez pas besoin de pirater le cadre de la barre d'onglets et vous ne dépendez pas de l'animation Push du contrôleur de navigation:
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
}
}
}
Oui. Vous pouvez masquer votre barre d’onglet lorsque vous appuyez pour afficher le contrôleur. Vous pouvez afficher la barre d'onglets chez vous. Vous pouvez masquer votre barre d'onglets lorsque vous appuyez sur le contrôleur View suivant.
Reportez-vous à l'image suivante Hide Botton Bar sur Push et définissez tous les contrôleurs de vues pour lesquels vous ne souhaitez pas utiliser la barre d'onglets.
J'espère que ça aide..
Pour ceux qui aiment tout faire par programme, ajoutez cette ligne à la méthode init
d'un ViewController
qui ne devrait pas avoir le tabBar:
hidesBottomBarWhenPushed = true
Parfois, le moyen le plus simple consiste simplement à ajouter une vue utilisant les limites 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
Parfois, les bords de la vue dépassent la barre de navigation, ce qui vous pose de nouveaux problèmes si vous étendez la disposition de la vue.
Ce code fonctionne sur iOS 10, 11 et iPhone X (simulateurs compris) pour afficher/masquer la barre de tabulation . Je l'ai créé plusieurs années (période iOS 7?) Et il fonctionne de manière fiable depuis ce temps.
Cela fonctionne très bien sur iPhone X tant que le contenu de vos contrôles childViewControllers (dans des onglets) est épinglé sur topLayoutGuide
, bottomLayoutGuide
ou SafeArea et non les murs principaux. Ensuite, tout fonctionne. Prendre plaisir!
@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
Utilisation - Je l'appelle dans viewController lors d'événements de rotation comme suit:
-(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];
}
}