Quelqu'un peut-il me dire comment changer la hauteur de la barre de navigation?
Voici ce que j'ai jusqu'à présent:
CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;
Vous pouvez créer une classe de catégorie basée sur UINavigationBar
comme ceci
fichier .h
#import UIKit/UIKit.h
@interface UINavigationBar (myNave)
- (CGSize)changeHeight:(CGSize)size;
@end
et fichier .m
#import "UINavigationBar+customNav.h"
@implementation UINavigationBar (customNav)
- (CGSize)sizeThatFits:(CGSize)size {
CGSize newSize = CGSizeMake(320,100);
return newSize;
}
@end
Cela fonctionne très bien.
Vous ne devez pas modifier la hauteur de la barre de navigation . Dans Apple Programing Guide on View Controller:
Personnalisation de l'apparence de la barre de navigation
Dans une interface de navigation, un contrôleur de navigation possède son objet UINavigationBar et est responsable de sa gestion. Il est interdit de modifier l'objet de la barre de navigation ou de modifier directement ses limites, son cadre ou ses valeurs alpha. Cependant, il est possible de modifier certaines propriétés, notamment:
● propriété barStyle
● propriété translucide
● propriété tintColor
(extrait de Apple: https://developer.Apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html )
- UPDATE - IOS 7 --- seules les propriétés disponibles peuvent encore être modifiées, mais vous trouverez ci-dessous un excellent didacticiel expliquant comment obtenir de la flexibilité dans la barre de navigation http://www.appcoda.com/customize -navigation-status-bar-ios-7/
sizeThatFits: ne fonctionne plus avec les sous-classes iOS11 UINavigationBar. Apple Engineering a confirmé que cette technique n'avait jamais été prise en charge et qu'avec iOS11, la taille de l'utilisateur n'est plus consultée.
J'ai résolu ce problème, j'ai créé la sous-classe de UINavigationController. Dans ce fichier MainNavigationViewController.m, je réécris la méthode viewDidLayoutSubviews (), où je définis le cadre pour self.navigationBar.
Essayez d'utiliser -
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
Remplacez - (void) la méthode viewWillAppear dans le viewController et essayez le code ci-dessous,
- (void)viewWillAppear {
UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}
La solution la plus simple et efficace consiste à ajouter une catégorie à la barre de navigation. (mais peut-être pas la meilleure solution)
@interface UINavigationBar (CustomHeight)
@end
@implementation UINavigationBar (CustomHeight)
- (CGSize)sizeThatFits:(CGSize)size {
CGRect screenRect = [[UIScreen mainScreen] bounds];
return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus);
}
@end
knavBarHeightNoStatus est la hauteur de votre barre de navigation. Nous utilisons les limites UIScreen car le cadre de UINavigationBar est incorrect
PS: Attention, vous pouvez avoir des problèmes si vous l’utilisez avec un SideMenu
self.navigationController.navigationBar.frame
est une propriété readonly
sur iOS version 4.x
il sera changé même si, vous verrez un comportement anormal.
par exemple, lorsque l'état de l'application est passé en arrière-plan et revient au premier plan, la barre de navigation affiche la hauteur d'origine
J'ai rencontré beaucoup de problèmes en fonction de la méthode choisie. Dans mon cas particulier, la barre de navigation était masquée dans l'ensemble de l'application, à l'exception du contrôleur de vue des paramètres. Comme j'avais besoin de spécifier une hauteur personnalisée de la barre de navigation et d'afficher la barre de navigation en même temps, la séparation entre le contrôleur de vue source et le contrôleur de vue de paramètres avait une animation très bâclée.
La meilleure solution absolue peut être trouvée ici: https://Gist.github.com/maciekish/c2c903d9b7e7b583b4b2 . Je viens d'importer la catégorie dans le contrôleur de vue de paramètres, et dans viewDidLoad
a appelé la méthode setHeight:
sur `self.navigationController.navigationBar '. C'est génial!
Le code suivant n’affectera pas les autres paramètres du cadre, sauf la hauteur.
[self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.Origin.x, self.navigationController.navigationBar.frame.Origin.y, self.navigationController.navigationBar.frame.size.width, 150)];
si vous voulez changer d’autres paramètres, il vous suffit d’éditer l’un quelconque des paramètres ....
Créer une catégorie et redéfinir sizeThatFits (_ size: CGSize) -> CGSize method modifie la taille de UINavigationBar dans l'ensemble de l'application. En supposant que vous souhaitiez modifier la hauteur/la taille de UINavigationBar uniquement dans un ViewController particulier (dans mon cas)
Voici comment je l'ai fait.
extension UINavigationBar {
open override func sizeThatFits(_ size: CGSize) -> CGSize {
let v = self.value(forKey: "frame") as? CGRect
return v?.size ?? CGSize(width: UIScreen.main.bounds.width, height: 44)
}
}
dans l'appelant ViewController ressemblerait à
override func viewDidLoad() {
super.viewDidLoad()
configureNavigationBar()
}
private func configureNavigationBar() {
var naviBarFrame = self.navigationController?.navigationBar.frame
naviBarFrame?.size.height = 74
let rect = naviBarFrame ?? CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 74)
self.navigationController?.navigationBar.setValue(rect, forKey: "frame")
}
Essayez ce code dans- (void)viewDidLayoutSubviews
method,
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];