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 :?
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;
}
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.
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:
Capturez la hauteur par défaut de UITabBar:
fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
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
}
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.
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):
Définissez ensuite Height
(supérieure à 0.0
) dans l'inspecteur Attributes ((4):
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
}
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 ().
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
}
}
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)
}
}
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);
}
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.
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
}
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
}
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
} }
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;
}
}
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
}
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
}
}