Modifier la hauteur UITabBar

J'utilise UITabBarController comme vue racine et l'application prend en charge iOS 6 et supérieur. La hiérarchie des classes de projet est la suivante.

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

J'ai utilisé le code ci-dessous 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 cela 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 ce:?

entrez la description de l'image ici

45
demandé sur sasquatch 2014-04-13 18:53:11

15 réponses

La hauteur de la barre d'onglets est une constante définie par Apple, vous ne pouvez donc pas la modifier.

-57
répondu Codengine 2015-12-19 11:40:38

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

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

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;
}
116
répondu Rushikesh 2016-08-24 20:17:01

Pour iOS 8.2, Xcode 6.2 Swift langue:

Créer un " DNMainTabVC.swift" (DeveloperNameMainTabViewController.fichier swift) pour votre UITabBarController (de type UITabBarController) et connectez-le à votre storyboard VC.

Ajouter 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
répondu MB_iOSDeveloper 2016-08-27 21:36:00

Swift3. 0, Swift 4.0 compatible

Pré-iPhone x hauteur de la barre d'onglets par défaut: 49pt

IPhone x hauteur de la barre d'onglets par défaut: 83pt

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

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

    fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
    
  2. Ajuster 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
        }
    
29
répondu Kiarash Asar 2017-09-13 06:23:51

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
répondu silentBeep 2015-12-19 12:26:26

Testé dans XCode 9.0 et Swift 4

Comme suggéré dans les réponses précédentes-hériter UITabBar et remplacer sizeThatFits, mais marquer height comme @IBInspectable, de sorte qu'il pourrait être défini dans le Générateur D'Interface :

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 le UITabBar dans l'Inspecteur D'identité (⌥⌘3):

Inspecteur D'Identité De Barre D'Onglets

Définissez ensuite Height souhaité (supérieur à 0.0) dans l'Inspecteur attributs (⌥⌘4):

Inspecteur Des Attributs De La Barre D'Onglets

21
répondu msrdjan 2017-09-26 11:43:44

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
répondu A.G 2016-02-11 12:16:57

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
    }
 }
5
répondu Ramazan Karami 2018-02-12 10:11:32

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
    }
}

avertissement: Si vous obtenez un espace vide sous votre barre d'onglets, assurez-vous d'avoir mis ce code dans viewWillLayoutSubviews() et non viewDidLoad().

4
répondu Kqtr 2017-05-31 19:56:25

Implémentation Xamarin:

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
répondu Alexey Strakh 2017-07-30 21:47:53

Swift 3.0 + remplacez 200 à la hauteur désirée dans le code ci-dessous.

   extension UITabBar {
        override open func sizeThatFits(_ size: CGSize) -> CGSize {
            return CGSize(width: UIScreen.main.bounds.width, height: 200)
        }
    }
4
répondu William Hu 2017-08-24 14:42:13

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

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

Qui devrait renvoyer sa largeur par défaut avec la hauteur de 60pts.

3
répondu nferocious76 2018-02-18 02:00:04

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

La barre d'onglets 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
}
1
répondu S. Azzopardi 2017-09-20 13:27:07

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
répondu Sultan Ali 2018-03-20 18:48:41

IPhoneX ont une hauteur différente, donc si nous passons à une hauteur plus petite, la forme de la barre d'onglets 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
répondu Abeer Iqbal 2018-03-21 16:37:50