web-dev-qa-db-fra.com

Changer la hauteur de UITabBar

J'utilise UITabBarController comme vue racine et l'application prend en charge iOS 6 et les versions ultérieures. La hiérarchie de classe de projet est comme ci-dessous.

UITabBarController
  - tab1
    - UINavigationController
      - UIViewController
      - UIViewController
      .
      .
  - tab2
    - UINavigationController
      - UIViewController
      - UIViewController
      .
      .
      .
  - tab3
    - UIViewController
  - tab4
    - UIViewController

J'ai utilisé ci-dessous le code pour changer la hauteur de UITabBar dans l'un des UIViewControllers (qui est à l'intérieur de UINavigationController) dans la hiérarchie ci-dessus.

CGRect tabbarFrame = self.tabBarController.tabBar.frame;
tabbarFrame.size.height += 60;
self.tabBarController.tabBar.frame = tabbarFrame;

Mais sa ne change pas la hauteur. UITabBar est affiché avec la hauteur par défaut. Bien que la journalisation de sa valeur imprime la valeur modifiée comme indiqué ci-dessous.

<UITabBar: 0xb528f60; frame = (0 431; 320 109); autoresize = W+TM; layer = <CALayer: 0xb529080>>

Comment puis-je changer la hauteur de UITabBar pour obtenir quelque chose comme ceci :?

enter image description here

50
Geek

J'ai fait face à ce problème et j'ai pu le résoudre. 

Vous devez ajouter le code suivant à votre sous-classe de la classe UITabBarController

const CGFloat kBarHeight = 80;

- (void)viewWillLayoutSubviews {

    CGRect tabFrame = self.tabBar.frame; //self.TabBar is IBOutlet of your TabBar
    tabFrame.size.height = kBarHeight;
    tabFrame.Origin.y = self.view.frame.size.height - kBarHeight;
    self.tabBar.frame = tabFrame;
}
122
Rushikesh

Pour iOS 8.2 , Xcode 6.2 langue Swift:

Créez un "DNMainTabVC.Swift" (fichier DeveloperNameMainTabViewController.Swift) pour votre UITabBarController (de type UITabBarController) et connectez-le à votre VC de scénario.

Ajoutez les lignes suivantes:

override func viewWillLayoutSubviews() {
    var tabFrame = self.tabBar.frame
    // - 40 is editable , the default value is 49 px, below lowers the tabbar and above increases the tab bar size
    tabFrame.size.height = 40
    tabFrame.Origin.y = self.view.frame.size.height - 40
    self.tabBar.frame = tabFrame
}

Cela a fonctionné pour moi.

39
MB_iOSDeveloper

Swift3.0, compatible Swift 4.0

Pre-iPhone X Hauteur de la barre d'onglets par défaut: 49 pts

iPhone X hauteur de barre d’onglet par défaut: 83pt

Une solution universelle prenant en charge tous les appareils iOS, y compris iPhone X la taille de l’écran ressemblerait à ceci:

  1. Capturez la hauteur par défaut de UITabBar:

    fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
    
  2. Ajustez la hauteur de UITabBar:

        override func viewWillLayoutSubviews() {
            super.viewWillLayoutSubviews()
    
            let newTabBarHeight = defaultTabBarHeight + 16.0
    
            var newFrame = tabBar.frame
            newFrame.size.height = newTabBarHeight
            newFrame.Origin.y = view.frame.size.height - newTabBarHeight
    
            tabBar.frame = newFrame
        }
    
32
Kiarash Asar

Créez une sous-classe personnalisée de type UITabBar, puis implémentez la méthode suivante:

@implementation CustomTabBar
#define kTabBarHeight = // Input the height we want to set for Tabbar here
-(CGSize)sizeThatFits:(CGSize)size
{
    CGSize sizeThatFits = [super sizeThatFits:size];
    sizeThatFits.height = kTabBarHeight;

    return sizeThatFits;
}
@end

J'espère que cela fonctionnera.

24
silentBeep

Testé dans XCode 9.0 et Swift 4

Comme suggéré dans les réponses précédentes - héritez de UITabBar et remplacez sizeThatFits, mais cochez height comme @IBInspectable afin qu'il puisse être défini dans le Interface Builder:

import UIKit

class CustomTabBar : UITabBar {
    @IBInspectable var height: CGFloat = 0.0

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var sizeThatFits = super.sizeThatFits(size)
        if height > 0.0 {
            sizeThatFits.height = height
        }
        return sizeThatFits
    }
}

Définissez la classe CustomTabBar pour la UITabBar dans l'inspecteur Identity (⌥⌘3):

 Tab Bar Identity Inspector

Définissez ensuite Height (supérieure à 0.0) dans l'inspecteur Attributes ((4):

 Tab Bar Attributes Inspector

23
msrdjan

Swift 2.0:

var tabBar:UITabBar?

override func viewWillLayoutSubviews() {
    var tabFrame: CGRect = self.tabBar!.frame
    tabFrame.size.height = 60
    tabFrame.Origin.y = self.view.frame.size.height - 60
    self.tabBar!.frame = tabFrame
}
11
A.G

Construire sur les réponses précédentes et mettre à jour pour Swift 3.

Sous-classe UITabController et assurez-vous d'affecter votre nouvelle classe personnalisée à l'inspecteur d'identité de votre UITabController. 

Swift 3.0

class MainTabBarController: UITabBarController {

    override func viewWillLayoutSubviews() {
        var newTabBarFrame = tabBar.frame

        let newTabBarHeight: CGFloat = 60
        newTabBarFrame.size.height = newTabBarHeight
        newTabBarFrame.Origin.y = self.view.frame.size.height - newTabBarHeight

        tabBar.frame = newTabBarFrame
    }
}

Warning: Si vous obtenez un espace vide en dessous de la barre d'onglets, assurez-vous d'avoir mis ce code dans viewWillLayoutSubviews () et non viewDidLoad ().

6
Kqtr

Pour Swift 4

extension UITabBar {

     override open func sizeThatFits(_ size: CGSize) -> CGSize {
     var sizeThatFits = super.sizeThatFits(size)
     sizeThatFits.height = 60 // adjust your size here
     return sizeThatFits
    }
 }
6
Ramazan Karami

Swift 3.0+ Remplacez 200 à la hauteur souhaitée dans le code ci-dessous.

   extension UITabBar {
        override open func sizeThatFits(_ size: CGSize) -> CGSize {
            return CGSize(width: UIScreen.main.bounds.width, height: 200)
        }
    }
5
William Hu

Xamarin implémentation:

public override void ViewWillLayoutSubviews()
{
    base.ViewWillLayoutSubviews();
    const float newTabBarHeight = 40f;
    TabBar.Frame = new CGRect(TabBar.Frame.X, TabBar.Frame.Y + (TabBar.Frame.Height - newTabBarHeight), TabBar.Frame.Width, newTabBarHeight);
}
4
Alexey Strakh

Vous pouvez modifier la hauteur de la barre d'onglets en la sous-classant. Je l'ai effectivement fait il y a longtemps. xcode 6.0

override func sizeThatFits(_ size: CGSize) -> CGSize {
    return CGSize(width: super.sizeThatFits(size).width, height: 60)
}

Cela devrait retourner sa largeur par défaut avec la hauteur de 60pts.

3
nferocious76

Pour une raison quelconque, la réponse de @Rushikesh fonctionnait plutôt bien jusqu'à iOS 10 mais j'ai eu quelques problèmes avec iOS 11 et Swift 3.2 .

Le TabBar changeait son cadre chaque fois que je touchais un nouvel onglet.

J'ai corrigé cela en mettant le code dans la fonction viewDidLayoutSubviews() au lieu de viewWillLayoutSubviews()

Swift 3:

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()
    var tabFrame            = tabBar.frame
    tabFrame.size.height    = 65
    tabFrame.Origin.y       = view.frame.size.height - 65
    tabBar.frame            = tabFrame
}
3
S. Azzopardi

FONCTIONNE AVEC TOUTES LES TAILLES D'ÉCRAN: Définissez tabBarHeight sur (hauteur d'origine du tabBar - 20), ce qui est important pour pouvoir l'utiliser ultérieurement dans viewDidLayoutSubviews, également mieux que de coder en dur la taille souhaitée. Depuis cette taille peut ne pas fonctionner sur tous les écrans. 

Les zones de sécurité des fenêtres maintiennent le rembourrage nécessaire au bas de la hauteur de la barre d’onglet afin de maintenir la distance par rapport au bord inférieur de l’écran. 

var tabBarHeight = CGFloat()

override func viewDidLoad() {
        super.viewDidLoad()
        tabBarHeight = self.tabBar.frame.height - 20
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        var tabFrame = self.tabBar.frame
        guard let window = UIApplication.shared.keyWindow else {return}
        tabFrame.size.height = tabBarHeight + window.safeAreaInsets.bottom
        self.tabBar.frame = tabFrame
    }
1
BrooklynCoder

c'est aussi une façon de le faire 

extension UITabBar {

override public func sizeThatFits(size: CGSize) -> CGSize {
    super.sizeThatFits(size)
    var sizeThatFits = super.sizeThatFits(size)
    sizeThatFits.height = 71
    return sizeThatFits
} }
1
Sultan Ali

iPhoneX a une hauteur différente, donc si nous passons à une hauteur inférieure, la forme de la barre de tabulation sera mauvaise dans iPhoneX

- (void)viewWillLayoutSubviews
{
    int requiredHeight = 55;
    CGRect tabFrame = self.tabBar.frame;
    if (tabFrame.size.height < requiredHeight)
    {
        tabFrame.size.height = requiredHeight;
        tabFrame.Origin.y = self.view.frame.size.height - requiredHeight;
        self.tabBar.frame = tabFrame;
    }
}
0
Abeer Iqbal

Réponses éditées de Kiarash Asar avec l'utilisation de Safe Area:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    var safeAreaBottomInset: CGFloat = 0.0

    if #available(iOS 11.0, *) {
        safeAreaBottomInset = view.safeAreaInsets.bottom
    }

    let newTabBarHeight: CGFloat = {{myDesiredHeight}} + safeAreaBottomInset

    var newFrame = tabBar.frame
    newFrame.size.height = newTabBarHeight
    newFrame.Origin.y = view.frame.size.height - newTabBarHeight

    tabBar.frame = newFrame
}
0
jonaszmclaren

Swift 4 & compatible avec iphone x  

class CustomTabBar : UITabBar {

@IBInspectable var height: CGFloat = 65.0

override open func sizeThatFits(_ size: CGSize) -> CGSize {
    guard let window = UIApplication.shared.keyWindow else {
        return super.sizeThatFits(size)
    }
    var sizeThatFits = super.sizeThatFits(size)
    if height > 0.0 {

        if #available(iOS 11.0, *) {
            sizeThatFits.height = height + window.safeAreaInsets.bottom
        } else {
            sizeThatFits.height = height
        }
    }
    return sizeThatFits
}
}
0
seggy